Nombre d'occurrences MySQL supérieur à 2

91

J'ai la structure de table suivante

+  id  +  word  +
+------+--------+

Le tableau est rempli avec les mots en minuscules d'un texte donné, donc le texte

Bonjour au revoir bonjour

entraînerait

+  id  +  word  +
+------+--------+
+   1  + hello  +
+------+--------+
+   2  + bye    +
+------+--------+
+   3  + hello  +
+------+--------+

Je veux faire une requête SELECT qui retournera le nombre de mots qui se répètent au moins deux fois dans le tableau (comme bonjour)

SELECT COUNT(id) FROM words WHERE (SELECT COUNT(words.word))>1

ce qui est bien sûr si faux et surchargé lorsque la table est grande. Une idée sur la façon d'atteindre un tel objectif? Dans l'exemple donné ci-dessus, je m'attendrais à 1

fabjoa
la source
Quelqu'un d'autre voit-il les traits de soulignement comme un pont de corde «affaissé»?
gouttelette

Réponses:

228

Pour obtenir une liste des mots qui apparaissent plusieurs fois avec leur fréquence d'apparition, utilisez une combinaison de GROUP BY et HAVING:

SELECT word, COUNT(*) AS cnt
FROM words
GROUP BY word
HAVING cnt > 1

Pour trouver le nombre de mots dans le jeu de résultats ci-dessus, utilisez-le comme sous-requête et comptez les lignes dans une requête externe:

SELECT COUNT(*)
FROM
(
    SELECT NULL
    FROM words
    GROUP BY word
    HAVING COUNT(*) > 1
) T1
Mark Byers
la source
1
Juste un addon, vous pouvez également utiliser l'alias dans "avoir". Comme SELECT mots, COUNT (*) AS cnt FROM words GROUP BY word HAVING cnt> 1
Vaibhav Jain
17
SELECT count(word) as count 
FROM words 
GROUP BY word
HAVING count >= 2;
bot403
la source
CodeIgniter prend également en charge l'avoir, donc c'était parfait. Merci
Gagné Jun Bae le
6

SELECT word, COUNT(*) FROM words GROUP by word HAVING COUNT(*) > 1

a1ex07
la source