2010-11-12 29 views
1

j'ai écrit une requête comme suit:Est-ce que cette requête MySQL renvoie toujours le résultat attendu?

SELECT COUNT(*) AS count, email 
    FROM sometable 
GROUP BY email 
ORDER BY count DESC 
    LIMIT 4 

Je suis intéressé à voir les quatre entrées de messagerie les plus dupliqués dans le tableau. Jusqu'à présent, il semble revenir exactement ce que je veux:

count email 
12  [email protected] 
2  [email protected] 
2  [email protected] 
1  [email protected] 

Quand je ne me LIMIT, je reçois le même résultat (mais avec beaucoup plus de lignes ayant un nombre = 1). Ce que je me demande est le LIMIT. À l'avenir, lorsque les chiffres changent, ma requête ci-dessus retournera-t-elle toujours les quatre courriels les plus utilisés? ou la requête doit-elle analyser la base de données entière pour rester précise?

(note:. Je ne cherche pas à éviter les doublons, je suis en train de voir l'e-mail le plus utilisé)

+0

Vous ne savez pas exactement ce que vous entendez par "ou la requête doit-elle analyser toute la base de données pour rester précise?" –

+0

Je veux dire, est-ce que la limite supprime peut-être des lignes qui auraient dû être incluses dans le compte? – Stephen

Répondre

2

Je ne suis pas sûr. Mais si vous êtes concerné, vous pouvez appliquer une limite à une sous-requête:

select * 
from 
(
    SELECT COUNT(*) AS count, email 
    FROM sometable 
    GROUP BY email 
    ORDER BY count DESC 
) 
limit 4 

Alternateively, vous pourriez faire quelque chose comme ça pour voir toutes les adresses e-mail en double (peut retourner plus ou moins 4):

SELECT COUNT(*) AS count, email 
    FROM sometable 
GROUP BY email 
having COUNT(email) > 1 
ORDER BY count DESC 
+0

Marquer cela comme correct, puisque vous êtes le premier à mentionner «Ayant» – Stephen

2

Eh bien la première chose est, la requête ne vous renvoie pas seulement les entrées en double. Regardez la 4ème rangée qui indique count = 1, ce qui signifie qu'elle ne se produit qu'une seule fois dans le tableau. Pour afficher la liste des enregistrements en double, vous devez modifier votre requête comme -

SELECT COUNT(*) AS count, email 
FROM sometable 
GROUP BY email 
HAVING COUNT(*) > 1 
ORDER BY count DESC  
LIMIT 4 

Ensuite, ce sera toujours vous revenir 4 entrées en double les plus hautes dans votre table comme l'ordre indiqué.

+0

Excellent, merci! – Stephen