106 votes

Sélection où le nombre d'un champ est supérieur à un

Je veux faire quelque chose comme ça :

SELECT * 
  FROM db.table 
 WHERE COUNT(someField) > 1

Comment puis-je réaliser cela dans MySql ?

158voto

OMG Ponies Points 144785

Utiliser le HAVING , pas WHERE pour la comparaison des résultats agrégés.

En prenant la requête au pied de la lettre :

SELECT * 
  FROM db.table 
HAVING COUNT(someField) > 1

Idéalement, il devrait y avoir un GROUP BY définis en vue d'une évaluation correcte dans le cadre de la HAVING mais MySQL autorise les colonnes cachées dans le GROUP BY ...

S'agit-il d'une préparation à une contrainte unique sur les someField ? Il semblerait que ce soit le cas...

12 votes

Besoin d'un GROUP BY (à moins qu'il ne s'agisse de quelque chose de non standard dans MySQL) ?

0 votes

@Martin Smith : A pris la requête au pied de la lettre ; a abordé le problème du GROUP BY (y compris la fonction des colonnes cachées).

0 votes

"On dirait que ça devrait être..." Pourquoi ? J'ai besoin d'être informé sur ce point :)

19voto

dandy_sql Points 31
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3

3 votes

La seule mise en garde ici (au moins dans la version 5.1.46-community MySQL Community Server (GPL)) est que "Chaque table dérivée doit avoir son propre alias", ce qui fera ressembler votre sql à : SELECT nom_utilisateur, numb from( Select nom_utilisateur, count(nom_utilisateur) as numb from clients GROUP BY nom_utilisateur ) as my_table WHERE numb > 3

0 votes

C'est utile lorsque je fais des regroupements en fonction de plusieurs colonnes. Merci de votre compréhension.

14voto

Bill Karwin Points 204877

Vous pouvez également le faire avec une jointure automatique :

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk

4voto

Martin Smith Points 174101

Dans un seul sens

SELECT t1.* 
FROM db.table t1
WHERE exists 
      (SELECT *
      FROM db.table t2 
      where t1.pk != t2.pk 
      and t1.someField = t2.someField)

1voto

Brent Arias Points 7104

Comme OMG Ponies l'a indiqué, c'est la clause de possession qui est recherchée. Toutefois, si vous espériez obtenir des lignes distinctes au lieu d'un résumé (la clause "having" crée un résumé), vous ne pouvez pas le faire en une seule déclaration. Dans ce cas, vous devez utiliser deux instructions.

1 votes

Ce n'est pas tout à fait vrai - utilisez le GROUP BY pour manipuler ce que l'HAVING utilise.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X