2010-10-14 17 views
67

Ich habe die folgende TabellenstrukturMySQL Vorkommen zählen mehr als 2

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

Die Tabelle mit den Worten in niedriger cas eines Textes, so dass der Text

Hallo bye hallo

gefüllt wird

würde in

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

ich eine SELECT-Abfrage machen möchten, dass die n zurückkehren Umbra von Worten, die mindestens zwei Mal in der Tabelle (wie hallo)

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

was natürlich falsch und Super-Überlastung ist so erhalten wiederholt, wenn Tabelle groß ist. Irgendeine Idee, wie man einen solchen Zweck erreicht? In dem gegebenen Beispiel inhärieren-oben, würde ich erwarten, 1

Antwort

152

Um eine Liste der Worte zu erhalten, die mehr als einmal zusammen erscheinen mit, wie oft sie auftreten, verwendet eine Kombination von GROUP BY und HAVING:

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

Um die Anzahl der Worte in dem obigen Ergebnis Set, das als Unterabfrage verwenden, und die Zeilen in einer äußeren Abfrage zählen:

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

Mist, versehentlich downvoted wenn Bedeutung zu upvote - danke für die tolle Antwort und sorry! –

+0

Nur ein Addon, Sie können den Alias ​​auch in "Haben" verwenden. Wie SELECT Wörter, COUNT (*) AS cnt FROM Worte GROUP BY Wort HAVING cnt> 1 –

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

CodeIgniter unterstützt auch, so dass dies perfekt war. Vielen Dank –

6

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