2010-09-28 23 views
4

Voici la requête que je utilise:mysql où count (nom_colonne) = 1?

SELECT k_id, COUNT(k_id) AS k_count 
FROM template_keyword_link 
WHERE k_id IN(1,2,3,4,5) 
GROUP BY k_id; 

Cette requête renvoie quelque chose comme
1 | 6
2 | 1
3 | 4
4 | 1
5 | 9

Je veux ajouter quelque chose comme AND COUNT(k_id) = 1 si je me retrouve avec
2 | 1
4 | 1

Cependant, je reçois invalide une fonction de groupe.

Comment ferais-je cela?


Mise à jour:

L'autre partie à ma question.

Peut-il être utilisé comme une instruction de suppression?

quelque chose comme

DELETE FROM 
template_keyword_link tkl 
LEFT JOIN keywords k 
ON tkl.k_id = k.k_id 
WHERE tkl.k_id 
IN(SELECT k_id, COUNT(k_id) AS k_count 
FROM template_keyword_link 
WHERE k_id IN(1,2) 
GROUP BY k_id 
HAVING k_count = 1); 

Je reçois

Vous avez une erreur dans votre syntaxe SQL;


donc en fonction des commentaires que j'ai modifié cette option pour utiliser

DELETE tkl, k FROM 
template_keyword_link tkl 
LEFT JOIN keywords k 
ON tkl.k_id = k.k_id 
WHERE tkl.k_id 
IN(SELECT k_id 
FROM template_keyword_link 
WHERE k_id IN(1,2) 
GROUP BY k_id 
HAVING COUNT(k_id) = 1); 

Cependant, je suis maintenant reçois

Vous ne pouvez pas spécifier la table cible 'tkl' pour la mise à jour dans la clause FROM

+0

Pouvez-vous ajouter la requête qui vous donne l'erreur? – JoshD

+0

ce que vous voulez est afficher l'ID, dont le nombre est 1 –

Répondre

9

WHERE clause est appliquée avant que le COUNT(*) a été calculé, de sorte que vous avez besoin dans HAVING, qui est appliqué après.

SELECT k_id, 
     COUNT(k_id) AS k_count 
    FROM template_keyword_link 
    WHERE k_id IN (1, 2, 3, 4, 5) 
GROUP BY k_id 
    HAVING k_count = 1 

Voir aussi: http://dev.mysql.com/doc/refman/5.1/en/select.html

** UPD **:

TIAS ;-) BTW, la requête syntaxiquement semble bien pour moi, MAIS ne pas vous oublier de préciser template_keyword_link et keywords clause de condition de jointure? Est-ce que mysql vous donne des erreurs?

+0

Cela deviendra la réponse acceptée dès que je peux :) – Hailwood

+0

Edité la requête pour les inclure;) Mais comme vous pouvez le voir, je reçois toujours une erreur. – Hailwood

+0

parce que 'IN' s'attend à n'obtenir qu'une seule colonne, alors que vous donnez 2. Déplacez' count (*) 'à' having'. – zerkms

3

Vous êtes à la recherche de la clause having qui se après groupement (la clause where est avant le regroupement):

SELECT k_id, COUNT(k_id) AS k_count 
FROM template_keyword_link 
WHERE k_id IN(1,2,3,4,5) 
GROUP BY k_id 
HAVING COUNT(k_id) = 1; 
-1

est une sous-requête Nested solution simple.

SELECT * FROM 
    (
    SELECT k_id, COUNT(k_id) AS k_count 
    FROM template_keyword_link 
    WHERE k_id IN(1,2,3,4,5) 
    GROUP BY k_id 
) inner 
WHERE inner.k_count = 1 
+0

HAVING est plus simple et plus explicite. – Porculus

0

essayer cette

SELECT k_id, COUNT(k_id) AS k_count 
FROM template_keyword_link 
WHERE k_id IN(1,2,3,4,5) 
GROUP BY k_id 
HAVING (COUNT(k_id) = 1)