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

100

Je veux faire quelque chose comme ça:

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

Comment puis-je y parvenir dans MySql?

Stevebot
la source

Réponses:

146

Utilisez la clause HAVING, not WHERE, pour la comparaison des résultats agrégés.

Prendre la requête à sa valeur nominale:

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

Idéalement, il devrait y avoir une valeur GROUP BYdéfinie pour une évaluation correcte dans la HAVINGclause, mais MySQL autorise les colonnes cachées de GROUP BY ...

Est-ce en préparation pour une contrainte unique sur someField? On dirait que ça devrait être ...

Poneys OMG
la source
11
Besoin d'un GROUP BYsurement (à moins que ce ne soit quelque chose de non standard MySQL)?
Martin Smith
@Martin Smith: a pris la requête à sa valeur nominale; Résolution du problème GROUP BY (y compris la fonction de colonnes masquées).
OMG Ponies
"On dirait que ça devrait être ..." Pourquoi? J'ai besoin d'éducation à ce sujet :)
Dave
Donc, cela retournera la table entière si elle contient plus de 2 someFieldvaleurs non nulles ou un jeu de résultats vide si ce n'est pas le cas.
Martin Smith le
@Dave: Si vous étiez dans une position où vous deviez vérifier et corriger périodiquement des données erronées, ne voudriez-vous pas empêcher la situation de se produire en premier lieu? MySQL implémente une contrainte unique en tant qu'index - pour plus d'informations, consultez la documentation CREATE INDEX
OMG Ponies
18
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3
dandy_sql
la source
3
la seule mise en garde ici (au moins dans le MySQL Community Server (GPL) de la communauté 5.1.46) est que "Chaque table dérivée doit avoir son propre alias", ce qui vous fera ressembler à sql: SELECT username, numb from (Select username, count (username) as numb from customers GROUP BY username) as my_table WHERE numb> 3
D_K
14

Vous pouvez également le faire avec une auto-jointure:

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk
Bill Karwin
la source
11

Voici:

SELECT Field1, COUNT(Field1)
  FROM Table1 
 GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc
Nalan Madheswaran
la source
4

Une manière

SELECT t1.* 
FROM db.table t1
WHERE exists 
      (SELECT *
      FROM db.table t2 
      where t1.pk != t2.pk 
      and t1.someField = t2.someField)
Martin Smith
la source
1

Comme l'a déclaré OMG Ponies, la clause ayant est ce que vous recherchez. Cependant, si vous espériez obtenir des lignes discrètes au lieu d'un résumé (le "ayant" crée un résumé), cela ne peut pas être fait en une seule instruction. Vous devez utiliser deux instructions dans ce cas.

Brent Arias
la source
1
Pas tout à fait vrai - utilisez le GROUP BY pour manipuler ce que le HAVING utilise.
OMG Ponies le
1

Je donne un exemple sur Group By entre deux tables dans Sql:

Select cn.name,ct.name,count(ct.id) totalcity from city ct left join country cn on ct.countryid = cn.id Group By cn.name,ct.name Having totalcity > 2


user4551254
la source
1

Pour moi, ne pas avoir de groupe vient de renvoyer un résultat vide. Donc, je suppose qu'avoir un groupe pour avoir une déclaration est assez important

Maham Khan
la source
-2

Il convient également de mentionner que le "pk" doit être un champ clé. L'auto-jointure

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

par Bill Karwin vous donne tous les disques qui sont des doublons et c'est ce que je voulais. Comme certains en ont plus de deux, vous pouvez obtenir le même enregistrement plusieurs fois. J'ai tout écrit dans une autre table avec les mêmes champs pour me débarrasser des mêmes enregistrements par suppression des champs clés. j'ai essayé

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

ci-dessus en premier. Les données renvoyées ne donnent qu'un seul des doublons, moins de la moitié de ce que cela vous donne, mais le décompte est bon si c'est tout ce que vous voulez.

Jim Blanchard
la source
3
Ce n’est pas vraiment une réponse.
anon582847382