2010-10-14 20 views
67

Mam następujące struktury tabeliliczą MySQL zdarzenia większe niż 2

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

tabela zostanie wypełniona słowami w niższych cas danego tekstu, więc tekst

Cześć cześć cześć

skutkowałoby

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

chcę zrobić kwerendę wybierającą, która powróci do n umbra słów, które się powtarza się co najmniej dwa razy w tabeli (jak cześć)

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

co oczywiście jest tak źle i super przeciążenia gdy stół jest duży. Masz pomysł, jak osiągnąć taki cel? W podanym przykładzie tkwią-powyżej, spodziewam 1

Odpowiedz

152

Aby uzyskać listę słów, które pojawiają się więcej niż raz, wraz z tym, jak często one występują, użyć kombinacji GROUP BY i HAVING:

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

Aby znaleźć liczbę słów w powyższej tabeli wynikowej, używać tego jako podzapytania i policzyć wiersze w zewnętrznej kwerendy:

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

Bzdura, przypadkowo odrzucona, gdy ma sens, aby przegłosować - dziękuję za wspaniałą odpowiedź i przepraszam! –

+0

Tylko dodatek, możesz użyć również aliasu w "posiadaniu". Podobnie jak WYBIERZ słowa, COUNT (*) AS cnt FROM słowa GROUP BY słowo HAVING cnt> 1 –

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

CodeIgniter również obsługuje posiadanie, więc to było idealne. Dzięki –

6

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

Powiązane problemy