2010-10-14 38 views
67

Tôi đã sau cấu trúc bảngMySQL đếm lần xuất hiện lớn hơn 2

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

Bảng được lấp đầy với dòng chữ trong cas thấp hơn của một văn bản nhất định, vì vậy các văn bản

Xin chào tạm biệt chào

sẽ dẫn đến

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

Tôi muốn thực hiện truy vấn SELECT sẽ trả về giá trị n các từ được lặp lại ít nhất hai lần trong bảng (như hello)

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

tất nhiên là quá sai và siêu quá tải khi bảng lớn. Bất kỳ ý tưởng về làm thế nào để đạt được mục đích đó? Trong ví dụ đưa vốn có-ở trên, tôi mong chờ 1

Trả lời

152

Để có được một danh sách các từ mà xuất hiện nhiều hơn một lần cùng với mức độ thường xuyên xảy ra, sử dụng một sự kết hợp của GROUP BY và HAVING:

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

Để tìm số từ trong tập hợp kết quả trên, sử dụng như một subquery và đếm các hàng trong một truy vấn bên ngoài:

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

Crap, vô tình downvoted khi ý nghĩa để upvote - cảm ơn cho câu trả lời tuyệt vời và xin lỗi! –

+0

Chỉ cần một addon, bạn có thể sử dụng bí danh cũng như trong "có". Giống như CHỌN từ, COUNT (*) AS cnt TỪ từ GROUP BY word HAVING cnt> 1 –

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

CodeIgniter cũng hỗ trợ, vì vậy điều này là hoàn hảo. Cảm ơn –

6

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

Các vấn đề liên quan