MySQL - Operand harus berisi 1 kolom

92

Saat mengerjakan sistem yang saya buat, saya mencoba menggunakan kueri berikut dalam proyek saya:

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

": cat" terikat oleh kode PHP saya karena saya menggunakan PDO. 2 adalah nilai yang valid untuk ": cat".

Kueri itu memberi saya kesalahan: "# 1241 - Operand harus berisi 1 kolom"

Apa yang membuat saya bingung adalah saya akan berpikir bahwa kueri ini tidak akan berhasil. Memilih kolom, lalu memilih dua lagi dari tabel lain, dan melanjutkan dari sana. Saya hanya tidak tahu apa masalahnya.

Apakah ada perbaikan sederhana untuk ini, atau cara lain untuk menulis kueri saya?

Bill Karwin
sumber

Jawaban:

103

Subkueri Anda memilih dua kolom, saat Anda menggunakannya untuk memproyeksikan satu kolom (sebagai bagian dari SELECTklausa luar ). Anda hanya dapat memilih satu kolom dari kueri semacam itu dalam konteks ini.

Pertimbangkan untuk bergabung ke usersmeja sebagai gantinya; ini akan memberi Anda lebih banyak fleksibilitas saat memilih kolom yang Anda inginkan 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
cdhowie.dll
sumber
Terima kasih atas tanggapannya. Saya akan memperbaiki kueri saya, dan menandai Anda sebagai jawabannya, tetapi hanya untuk masukan, apakah menurut Anda ada cara yang "lebih baik" untuk menulis kueri saya daripada yang saya gunakan sekarang (tetapi juga mengabaikan kesalahan di dalamnya)?
Ah. Terima kasih telah mengedit postingan asli Anda. Saya pasti akan menandai Anda sebagai jawaban saat StackOverflow mengizinkan saya. Terima kasih banyak!
Nah, COUNT()itu membuang sedikit; kueri yang saya berikan mungkin akan memberikan kesalahan karena agregasi. Anda mungkin perlu memindahkan agregasi tersebut ke subkueri, bergantung pada tujuan kueri Anda (yang saat ini tidak jelas bagi saya).
cdhowie
17

Kesalahan ini juga dapat terjadi jika Anda tidak sengaja menggunakan koma, bukan ANDdi ONklausa a JOIN:

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

Kesalahan ini juga dapat terjadi jika Anda tidak sengaja menggunakan, =bukan INdi WHEREklausa:

SEBAGAI CONTOH:

WHERE product_id = (1,2,3);
jay padaliya
sumber
1
Atau LIKE bukannya IN seperti yang saya lakukan dan tidak bisa menemukan mengapa kesalahan ini terjadi. ty untuk penunjuk.
Edgars Aivars
Ini juga dapat terjadi jika Anda meletakkan tanda kurung di sekitar bidang di klausa SELECT, misalnya SELECT (Field1, Field2) 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)

Nah, Anda tidak bisa mendapatkan banyak kolom dari satu subkueri seperti itu. Untungnya, kolom kedua sudah posts.posted_by! Begitu:

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)
...
Ry-
sumber
1

Dalam kasus saya, masalahnya adalah saya mengelilinginya pemilihan kolom saya dengan tanda kurung karena kesalahan:

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

Dan harus:

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

Kedengarannya konyol, tetapi itu menyebabkan kesalahan ini dan butuh beberapa waktu untuk mengetahuinya.

Mauro Bilotti
sumber
Saya tidak percaya inilah masalah saya, saya pikir tanda kurung legal di sana
Josh McGee
0

Tempat lain kesalahan ini dapat terjadi adalah menetapkan nilai yang memiliki koma di luar string. Sebagai contoh:

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

Kesalahan ini juga dapat terjadi jika Anda tidak sengaja melewatkannya if nama fungsi.

sebagai contoh:

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);

Punya masalah ini ketika saya melewatkan menempatkan if dalam iffungsinya!

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

Di sini Anda menggunakan sub-kueri tetapi sub-kueri ini harus mengembalikan hanya satu kolom. Pisahkan jika tidak maka akan muncul kesalahan.

Moshiur Rahman
sumber
0

Saya mendapat kesalahan ini saat menjalankan skrip MySQL di konsol Intellij, karena menambahkan tanda kurung di tempat yang salah:

SALAH:

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

BAIK:

SELECT user.id
FROM user
WHERE id IN :ids; # No brackets is correct
Janac Meena
sumber
ini tidak cocok dengan jawaban pertama di sini: stackoverflow.com/questions/24551177/…
rubydio
@rubydio, pertanyaan itu merujuk pada HQL dan Hibernate, sedangkan jawaban saya mengacu pada MySQL di konsol Intellij
Janac Meena