MySQL - Operand ควรมี 1 คอลัมน์


93

ขณะทำงานกับระบบที่ฉันกำลังสร้างฉันพยายามใช้แบบสอบถามต่อไปนี้ในโครงการของฉัน:

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" ถูกผูกไว้ด้วยรหัส PHP ของฉันขณะที่ฉันใช้ PDO 2 เป็นค่าที่ถูกต้องสำหรับ ": cat"

ข้อความค้นหานั้นทำให้ฉันมีข้อผิดพลาด: "# 1241 - Operand ควรมี 1 คอลัมน์"

สิ่งที่ทำให้ฉันสะดุดคือฉันคิดว่าแบบสอบถามนี้จะใช้งานได้ไม่มีปัญหา เลือกคอลัมน์จากนั้นเลือกอีกสองรายการจากตารางอื่นและดำเนินการต่อจากที่นั่น ฉันคิดไม่ออกว่าปัญหาคืออะไร

มีวิธีแก้ไขง่ายๆหรือวิธีอื่นในการเขียนแบบสอบถามของฉัน?

คำตอบ:


104

การสืบค้นย่อยของคุณกำลังเลือกสองคอลัมน์ในขณะที่คุณกำลังใช้เพื่อฉายภาพหนึ่งคอลัมน์ (เป็นส่วนหนึ่งของSELECTประโยคนอก) คุณสามารถเลือกคอลัมน์จากแบบสอบถามดังกล่าวในบริบทนี้ได้เพียงคอลัมน์เดียว

พิจารณาเข้าร่วมusersโต๊ะแทน 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

ขอบคุณสำหรับการตอบกลับ ฉันจะแก้ไขคำถามของฉันและทำเครื่องหมายว่าคุณเป็นคำตอบ แต่สำหรับการป้อนข้อมูลคุณคิดว่ามีวิธีที่ "ดีกว่า" ในการเขียนข้อความค้นหาของฉันมากกว่าสิ่งที่ฉันใช้อยู่ตอนนี้ (แต่ยังไม่คำนึงถึงข้อผิดพลาดในนั้นด้วย)

อา. ขอบคุณสำหรับการแก้ไขโพสต์ต้นฉบับของคุณ ฉันจะทำเครื่องหมายว่าคุณเป็นคำตอบเมื่อ StackOverflow ให้ฉัน ขอบคุณมาก!

ดีCOUNT()มีการขว้างปาสิ่งปิดบิต; ข้อความค้นหาที่ฉันระบุอาจให้ข้อผิดพลาดเนื่องจากการรวม คุณอาจต้องย้ายการรวมนั้นไปไว้ในแบบสอบถามย่อยโดยขึ้นอยู่กับเป้าหมายของข้อความค้นหาของคุณ (ซึ่งยังไม่ชัดเจนสำหรับฉันในขณะนี้)
cdhowie

17

ข้อผิดพลาดนี้อาจเกิดขึ้นได้หากคุณใช้เครื่องหมายจุลภาคโดยไม่ได้ตั้งใจแทนที่จะใช้ANDในONประโยคของJOIN:

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

9

ข้อผิดพลาดนี้อาจเกิดขึ้นได้หากคุณเผลอใช้=แทนINในWHEREประโยค:

ตัวอย่างเช่น:

WHERE product_id = (1,2,3);

1
หรือ LIKE แทนที่จะเป็น IN เหมือนที่ฉันทำและไม่พบว่าเหตุใดจึงเกิดข้อผิดพลาดนี้ ty สำหรับตัวชี้
Edgars Aivars

นอกจากนี้ยังสามารถเกิดขึ้นได้หากคุณใส่วงเล็บรอบ ๆ ฟิลด์ในส่วนคำสั่ง SELECT เช่น SELECT (Field1, Field2) จากตาราง
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)

คุณไม่สามารถรับหลายคอลัมน์จากแบบสอบถามย่อยแบบนั้นได้ โชคดีที่คอลัมน์ที่สองมาแล้วposts.posted_by! ดังนั้น:

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

ในกรณีของฉันปัญหาคือฉันล้อมรอบการเลือกคอลัมน์ของฉันด้วยวงเล็บโดยไม่ได้ตั้งใจ:

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

และจะต้องเป็น:

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

ฟังดูงี่เง่า แต่มันทำให้เกิดข้อผิดพลาดนี้และต้องใช้เวลาพอสมควรในการคิดออก


ฉันไม่อยากจะเชื่อเลยว่านี่คือปัญหาของฉันฉันคิดว่าวงเล็บถูกกฎหมายที่นั่น
Josh McGee

0

อีกที่หนึ่งที่ข้อผิดพลาดนี้อาจเกิดขึ้นได้คือการกำหนดค่าที่มีเครื่องหมายจุลภาคอยู่นอกสตริง ตัวอย่างเช่น:

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

0

ข้อผิดพลาดนี้อาจเกิดขึ้นได้หากคุณพลาดifชื่อฟังก์ชันโดยไม่ได้ตั้งใจ

ตัวอย่างเช่น:

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

มีปัญหานี้เมื่อฉันพลาดการใส่ifในifฟังก์ชัน!


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

ที่นี่คุณใช้แบบสอบถามย่อย แต่แบบสอบถามย่อยนี้ต้องส่งคืนคอลัมน์เดียวเท่านั้น แยกออกมิฉะนั้นจะแสดงข้อผิดพลาด


0

ฉันได้รับข้อผิดพลาดนี้ขณะเรียกใช้สคริปต์ MySQL ในคอนโซล Intellij เนื่องจากเพิ่มวงเล็บผิดตำแหน่ง:

ไม่ถูกต้อง:

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

ขวา:

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

ไม่ตรงกับคำตอบแรกที่นี่stackoverflow.com/questions/24551177/…
rubydio

@rubydio คำถามนั้นอ้างอิงถึง HQL และ Hibernate ในขณะที่คำตอบของฉันอ้างถึง MySQL ในคอนโซล Intellij
Janac Meena
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.