web-dev-qa-db-fra.com

Erreur MySQL "L'opérande doit contenir 1 colonne"

Je pourrais trouver beaucoup de questions similaires mais pas de solution réelle à mon problème.

Ma requête SQL:

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

Le code d'erreur que je reçois est

#1241 - Operand should contain 1 column(s)

Si je viens d'utiliser la requête entre parenthèses cela fonctionne et le résultat est

ID | COUNTER
0002159 | 1

Où est mon erreur? Merci beaucoup pour votre aide.

9
jacob

Le problème est que votre requête interne renvoie deux colonnes. Modifiez votre requête comme 

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

Cela devrait marcher. 

Une dernière suggestion: êtes-vous sûr que votre requête interne renverra toujours une ligne? Si vous souhaitez que EMAIL soit défini sur la valeur 0 pour plusieurs ID renvoyés par une requête interne, je vous recommande d'utiliser "IN" à la place. de "=".

11
sak

Votre sous-requête contient deux colonnes. Essaye ça:

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

J'ai supprimé COUNT(ID) pour que vous ne sélectionniez que l'ID et le mettiez à la place dans votre clause HAVING.

De plus, à moins que vous ne soyez sûr que cette requête ne renvoie jamais plus d'une ligne, vous devez gérer la possibilité de doublons. Changez en WHERE ID IN au lieu de WHERE ID = ou limitez le nombre de résultats renvoyés par la requête. La méthode de limitation des résultats dépend de vos exigences - l'ajout de LIMIT 1 à la sous-requête fonctionnera, mais vous souhaiterez peut-être effectuer un tri ou utiliser MIN/MAX pour spécifier la ligne que vous obtenez.

2
Ryan P

Le problème est avec votre sous-requête:

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

vous essayez de le comparer à ID mais vous retournez deux colonnes

1
James C
WHERE ID IN (SELECT ID 
                FROM EIGENSCHAFTEN 
                WHERE Kategorie = "BOUNCE" 
                GROUP BY ID
                HAVING COUNT(*) = 1 )
0
DRapp
UPDATE ADRESSEN
SET EMAIL = 0
WHERE ID = (SELECT ID
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID
HAVING COUNT(*) = 1)
0
Teja