2012-03-14 35 views
9

Tôi có thể tìm thấy nhiều câu hỏi tương tự nhưng không có giải pháp thực sự cho vấn đề của mình.Lỗi MySQL "Toán tử phải chứa 1 cột"

truy vấn SQL của tôi:

UPDATE ADRESSEN 
SET EMAIL = 0 
WHERE ID = (SELECT ID, COUNT(ID) AS COUNTER 
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID 
HAVING COUNTER = 1) 

Mã lỗi tôi nhận được là

#1241 - Operand should contain 1 column(s) 

Nếu tôi chỉ sử dụng các truy vấn trong ngoặc nó hoạt động và kết quả là

ID | COUNTER 
0002159 | 1 

Lỗi của tôi ở đâu? Cảm ơn rất nhiều sự giúp đỡ của bạn.

+0

Ur Truy vấn phụ trả lại hai cột và không có cách nào hợp lệ ... – Teja

Trả lời

0
WHERE ID IN (SELECT ID 
       FROM EIGENSCHAFTEN 
       WHERE Kategorie = "BOUNCE" 
       GROUP BY ID 
       HAVING COUNT(*) = 1) 
1

Vấn đề là với subquery của bạn:

SELECT ID, COUNT(ID) AS COUNTER FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" GROUP BY ID HAVING COUNTER = 1 

bạn đang cố gắng để so sánh nó với ID nhưng đang quay trở lại hai cột

2

subquery của bạn có chứa hai cột. Hãy thử điều này:

UPDATE ADRESSEN 
SET EMAIL = 0 
WHERE ID = (SELECT ID 
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID 
HAVING COUNT(ID) = 1) 

Tôi đã gỡ bỏ COUNT(ID) vì vậy bạn chỉ chọn ID, và đặt rằng thay vì tại khoản HAVING của bạn.

Ngoài ra, trừ khi bạn chắc chắn truy vấn này sẽ không bao giờ trả về nhiều hàng, bạn cần phải đối phó với khả năng trùng lặp. Hoặc thay đổi thành WHERE ID IN thay vì WHERE ID = hoặc giới hạn số lượng kết quả mà truy vấn trả lại. Phương pháp để giới hạn kết quả sẽ phụ thuộc vào yêu cầu của bạn - thêm LIMIT 1 vào truy vấn con sẽ hoạt động, nhưng bạn có thể muốn phân loại hoặc sử dụng MIN/MAX để chỉ định hàng bạn nhận được.

0
UPDATE ADRESSEN 
SET EMAIL = 0 
WHERE ID = (SELECT ID 
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID 
HAVING COUNT(*) = 1) 
10

Vấn đề là truy vấn bên trong của bạn trả về hai cột. Sửa đổi truy vấn của bạn như

UPDATE ADRESSEN 
SET EMAIL = 0 
WHERE ID = (SELECT ID 
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID 
HAVING COUNT(ID) = 1) 

Điều này sẽ hiệu quả.

Tôi có một đề xuất khác, bạn có chắc chắn rằng truy vấn bên trong của bạn sẽ luôn trả về một hàng? Nếu bạn muốn EMAIL được đặt bằng giá trị 0 cho nhiều ID được truy vấn bên trong trả về, tôi khuyên bạn nên sử dụng "IN" thay vì "=".

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