MySQL - Toán hạng phải chứa 1 (các) cột


92

Trong khi làm việc trên hệ thống tôi đang tạo, tôi đã cố gắng sử dụng truy vấn sau trong dự án của mình:

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" bị ràng buộc bởi mã PHP của tôi khi tôi đang sử dụng PDO. 2 là giá trị hợp lệ cho ": cat".

Tuy nhiên, truy vấn đó mang lại cho tôi lỗi: "# 1241 - Toán hạng phải chứa 1 (các) cột"

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

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

Câu trả lời:


103

Truy vấn con của bạn đang chọn hai cột, trong khi bạn đang sử dụng nó để chiếu một cột (như một phần của SELECTmệnh đề bên ngoài ). Bạn chỉ có thể chọn một cột từ một truy vấn như vậy trong ngữ cảnh này.

usersThay vào đó, hãy cân nhắc tham gia vào bảng; điều này sẽ giúp bạn linh hoạt hơn khi chọn cột bạn muốn 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

Cảm ơn vì sự trả lời. Tôi sẽ sửa truy vấn của mình và đánh dấu bạn là câu trả lời, nhưng chỉ để nhập liệu, 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 cách tôi đang sử dụng bây giờ (nhưng cũng bỏ qua lỗi trong đó)?

Ah. Cảm ơn bạn đã chỉnh sửa bài viết 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!

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

17

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ì ANDtrong ONmệnh đề của JOIN:

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

9

Lỗi này cũng có thể xảy ra nếu bạn vô tình sử dụng =thay thế INtrong WHEREmệnh đề:

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ỏ.
Edgars Aivars

Nó cũng có thể xảy ra nếu bạn đặt dấu ngoặc nhọn xung quanh các trường trong mệnh đề CHỌN, ví dụ: CHỌN (Trường1, Trường2) TỪ Bảng
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)

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

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

Trong trường hợp của tôi, vấn đề là tôi đã nhầm lẫn lựa chọn cột của mình bằng dấu ngoặc đơn:

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

Và phải:

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

Nghe có vẻ ngớ ngẩn, nhưng nó đã gây ra lỗi này và phải mất một thời gian để tìm ra nó.


Tôi không thể tin đây là vấn đề của tôi, tôi nghĩ rằng dấu ngoặc là hợp pháp ở đó
Josh McGee

0

Một nơi khác mà lỗi này có thể xảy ra là gán một giá trị có dấu phẩy bên ngoài một chuỗi. Ví dụ:

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

0

Lỗi này cũng có thể xảy ra nếu bạn vô tình bỏ sót iftên hàm.

ví dụ:

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

Gặp sự cố này khi tôi bỏ lỡ đặt if trong ifhàm!


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

Ở đây bạn sử dụng truy vấn phụ nhưng truy vấn phụ này chỉ phải trả về một cột. Tách nó ra nếu không nó sẽ hiển thị lỗi.


0

Tôi gặp lỗi này khi thực thi tập lệnh MySQL trong bảng điều khiển Intellij do thêm dấu ngoặc vào sai vị trí:

SAI LẦM:

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

ĐÚNG:

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

điều này không khớp với câu trả lời đầu tiên ở đây: stackoverflow.com/questions/24551177/…
rubydio

@rubydio, câu hỏi đó đề cập đến HQL và Hibernate, trong khi câu trả lời của tôi đề cập đến MySQL trong bảng điều khiển Intellij
Janac Meena
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.