2010-10-14 6 views
67

J'ai la structure de tableau suivantoccurrences compter MySQL plus de 2

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

Le tableau est rempli avec les mots TAS bas d'un texte donné, de sorte que le texte

Bonjour bye bonjour

entraînerait

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

Je veux faire une requête SELECT qui renverra le n mbre de mots qui se répète au moins deux fois dans la table (comme bonjour)

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

qui est bien sûr si mal et super quand la surcharge table est grande. Une idée sur la façon d'atteindre un tel but? Dans l'exemple inhérents au-dessus donné, j'attendre 1

Répondre

152

Pour obtenir une liste des mots qui apparaissent plus d'une fois avec quelle fréquence ils se produisent, utilisent une combinaison de GROUP BY:

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, l'utiliser comme une sous-requête et compter les lignes dans une requête externe:

SELECT COUNT(*) 
FROM 
(
    SELECT NULL 
    FROM words 
    GROUP BY word 
    HAVING COUNT(*) > 1 
) T1 
+0

Merde, accidentellement downvoted au sens de upvote - merci pour la bonne réponse et désolé! –

+0

Juste un addon, vous pouvez aussi utiliser l'alias dans "avoir". Comme SELECT mots, COUNT (*) AS cnt FROM mots GROUPE PAR mot AYANT cnt> 1 –

13
SELECT count(word) as count 
FROM words 
GROUP BY word 
HAVING count >= 2; 
+0

CodeIgniter prend également en charge avoir, donc c'était parfait. Merci –

6

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

Questions connexes