Réponses:
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 BY
définie pour une évaluation correcte dans la HAVING
clause, 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 ...
someField
valeurs non nulles ou un jeu de résultats vide si ce n'est pas le cas.
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3
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
Voici:
SELECT Field1, COUNT(Field1)
FROM Table1
GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc
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)
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.
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
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
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.
GROUP BY
surement (à moins que ce ne soit quelque chose de non standard MySQL)?