2012-12-26 29 views
48

Trong khi làm việc trên một hệ thống tôi là tạo ra, tôi cố gắng sử dụng các truy vấn sau đây trong dự án của tôi:MySQL - Operand nên chứa 1 cột (s)

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 

": mèo" bị ràng buộc bởi PHP của tôi khi tôi đang sử dụng PDO. 2 là một giá trị hợp lệ cho ": cat".

truy vấn đó mặc dù mang lại cho tôi một lỗi: "# 1241 - Operand nên chứa 1 cột (s)"

gì gốc cây tôi là tôi sẽ nghĩ rằng truy vấn này sẽ làm việc không có vấn đề. Chọn cột, sau đó chọn hai cột khác từ bảng khác và tiếp tục từ đó. Tôi không thể tìm ra vấn đề là gì.

Có cách khắc phục đơn giản này hay cách khác để viết truy vấn của tôi không?

Trả lời

57

subquery của bạn là lựa chọn hai cột, trong khi bạn đang sử dụng nó để một cột dự án (như một phần của bên ngoài SELECT khoản). Bạn chỉ có thể chọn một cột từ truy vấn như vậy trong ngữ cảnh này.

Cân nhắc tham gia bảng users thay thế; điều này sẽ giúp bạn linh hoạt hơn khi chọn những cột bạn muốn từ 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 
+0

Cảm ơn bạn đã phản hồi. Tôi sẽ sửa chữa truy vấn của tôi, và đánh dấu bạn là câu trả lời, nhưng chỉ cho đầu vào, bạn có nghĩ rằng có cách "tốt hơn" để viết truy vấn của tôi so với những gì tôi đang sử dụng bây giờ (nhưng cũng bỏ qua lỗi trong đó)? –

+0

Ah. Cảm ơn bạn đã chỉnh sửa bài đăng gốc của bạn. Tôi chắc chắn sẽ đánh dấu bạn là câu trả lời khi StackOverflow cho phép tôi. Cảm ơn rất nhiều! –

+0

Vâng, 'COUNT()' đang ném mọi thứ ra một chút; truy vấn tôi đã đưa ra có thể sẽ gây ra lỗi do tập hợp. Bạn có thể cần phải di chuyển tập hợp đó vào truy vấn con, tùy thuộc vào mục tiêu truy vấn của bạn (hiện tại không rõ ràng với tôi). – cdhowie

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

Vâng, bạn không thể nhận nhiều cột từ một truy vấn phụ như vậy. May mắn thay, cột thứ hai đã là posts.posted_by! Vì vậy:

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) 
... 
6

Lỗi này cũng có thể xảy ra nếu bạn vô tình sử dụng dấu phẩy thay vì AND trong ON khoản của một JOIN:

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

Lỗi này cũng có thể xảy ra nếu bạn vô tình sử dụng '=' thay vì ' tRÊN' trong mệnh đề WHERE:

VÍ DỤ:

WHERE product_id = (1,2,3); 
+1

Hoặc LIKE thay vì IN như tôi đã làm và không thể tìm thấy lý do tại sao lỗi này xảy ra. ty cho con trỏ. –

Các vấn đề liên quan