MySQL - Operand 1 sütun içermelidir


92

Oluşturduğum bir sistem üzerinde çalışırken aşağıdaki sorguyu projemde kullanmaya çalıştım:

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
    users.id AS posted_by_id
    FROM users
    WHERE users.id = posts.posted_by)
FROM topics
LEFT OUTER JOIN posts ON posts.topic_id = topics.id
WHERE topics.cat_id = :cat
GROUP BY topics.id

PDO kullandığım için ": cat" PHP koduma bağlı. 2, ": cat" için geçerli bir değerdir.

Yine de bu sorgu bana bir hata veriyor: "# 1241 - İşlenen 1 sütun içermelidir"

Beni şaşırtan şey, bu sorgunun sorun olmayacağını düşünmem. Sütunları seçin, ardından başka bir tablodan iki tane daha seçin ve oradan devam edin. Sorunun ne olduğunu çözemiyorum.

Bunun basit bir çözümü veya sorgumu yazmanın başka bir yolu var mı?

Yanıtlar:


103

Alt sorgunuz, siz onu bir sütunu yansıtmak için kullanırken (dış SELECTcümlenin bir parçası olarak) iki sütun seçiyor . Bu bağlamda böyle bir sorgudan yalnızca bir sütun seçebilirsiniz.

usersBunun yerine masaya katılmayı düşünün ; Bu, hangi sütunlardan istediğinizi seçerken size daha fazla esneklik sağlayacaktır users.

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
users.username AS posted_by,
users.id AS posted_by_id

FROM topics

LEFT OUTER JOIN posts ON posts.topic_id = topics.id
LEFT OUTER JOIN users ON users.id = posts.posted_by

WHERE topics.cat_id = :cat
GROUP BY topics.id

Cevabınız için teşekkürler. Sorgumu düzelteceğim ve sizi yanıt olarak işaretleyeceğim, ancak yalnızca giriş için, sorgumu yazmanın şu anda kullandığımdan "daha iyi" bir yolu olduğunu düşünüyor musunuz (ama aynı zamanda içindeki hatayı da göz ardı ederek)?

Ah. Orijinal gönderinizdeki düzenleme için teşekkür ederiz. StackOverflow izin verdiğinde sizi cevap olarak işaretleyeceğimden emin olacağım. Çok teşekkürler!

Şey, COUNT()işleri biraz bozuyor; Verdiğim sorgu muhtemelen toplama nedeniyle bir hata verecektir. Sorgunuzun hedeflerine bağlı olarak bu toplamayı bir alt sorguya taşımanız gerekebilir (şu anda benim için net değil).
cdhowie

17

Yanlışlıkla yerine virgül kullanmak, bu hata da oluşabilir ANDiçinde ONa maddesi JOIN:

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma

9

Bu hata , madde =yerine yanlışlıkla kullanırsanız da ortaya çıkabilir :INWHERE

ÖRNEĞİN:

WHERE product_id = (1,2,3);

1
Veya yaptığım gibi IN yerine GİBİ ve bu hatanın neden olduğunu bulamadım. işaretçi için ty.
Edgars Aivars

SELECT cümlesindeki alanların etrafına köşeli parantez koyarsanız da olabilir, örneğin SELECT (Alan1, Alan2) FROM Table
Paul Chris Jones

6
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
    users.id AS posted_by_id
    FROM users
    WHERE users.id = posts.posted_by)

Bunun gibi bir alt sorgudan birden fazla sütun alamazsınız. Neyse ki, ikinci sütun zaten posts.posted_by! Yani:

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
posts.posted_by
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by_username
    FROM users
    WHERE users.id = posts.posted_by)
...

1

Benim durumumda sorun, sütun seçimimi yanlışlıkla parantezle çevrelememdi:

SELECT (p.column1, p.colum2, p.column3) FROM table1 p where id = 1;

Ve şöyle olmalı:

SELECT p.column1, p.colum2, p.column3 FROM table1 p where id = 1;

Aptalca geliyor, ancak bu hataya neden oluyordu ve anlaşılması biraz zaman aldı.


Sorunumun bu olduğuna inanamıyorum, parantezlerin yasal olduğunu sanıyordum
Josh McGee

0

Bu hatanın meydana gelebileceği başka bir yer, dizenin dışında virgül bulunan bir değer atamaktır. Örneğin:

SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)

0

Bu hata, yanlışlıkla ifişlev adını kaçırırsanız da ortaya çıkabilir .

Örneğin:

set v_filter_value = 100;

select
    f_id,
    f_sale_value
from
    t_seller
where
    f_id = 5
    and (v_filter_value <> 0, f_sale_value = v_filter_value, true);

Ben koyarak cevapsız bu sorun var ise de ifişlevi!


0
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)

Burada alt sorgu kullanıyorsunuz, ancak bu alt sorgu yalnızca bir sütun döndürmelidir. Onu ayırın, aksi takdirde hata gösterecektir.


0

Yanlış yere parantez eklediğim için bir Intellij konsolunda bir MySQL komut dosyası çalıştırırken bu hatayı aldım:

YANLIŞ:

SELECT user.id
FROM user
WHERE id IN (:ids); # Do not put brackets around list argument

SAĞ:

SELECT user.id
FROM user
WHERE id IN :ids; # No brackets is correct

bu, buradaki ilk cevapla uyuşmuyor: stackoverflow.com/questions/24551177/…
rubydio

@rubydio, bu soru HQL ve Hibernate'e atıfta bulunurken, cevabım Intellij konsolundaki MySQL'e atıfta bulunuyor
Janac Meena
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.