2011-01-31 17 views
23

Tôi có hai bảng: groupsgroup_members.MySQL tham gia và COUNT (*) từ một bảng khác

Bảng groups chứa tất cả các thông tin cho mỗi nhóm, chẳng hạn như ID, tiêu đề, mô tả của nó, vv

Trong bảng group_members, nó sẽ liệt kê tất cả các thành viên là ngoài của từng nhóm như thế này:

group_id | user_id 
1 | 100 
2 | 23 
2 | 100 
9 | 601 

Về cơ bản, tôi muốn liệt kê BA nhóm trên một trang và tôi chỉ muốn liệt kê các nhóm có hơn 4 thành viên. Bên trong vòng <?php while ?>, tôi muốn bốn thành viên ngoài nhóm đó. Tôi không gặp khó khăn khi liệt kê các nhóm và liệt kê các thành viên trong vòng lặp nội bộ khác, tôi không thể tinh chỉnh các nhóm để chỉ những người có hơn 4 thành viên hiển thị.

Có ai biết cách thực hiện việc này không? Tôi chắc chắn nó với sự tham gia của MySQL.

Trả lời

49

Sử dụng MySQL HAVING tuyên bố cho tác vụ này.

truy vấn của bạn sẽ trông như thế này:

SELECT g.group_id, COUNT(m.member_id) AS members 
FROM groups AS g 
LEFT JOIN group_members AS m USING(group_id) 
GROUP BY g.group_id 
HAVING members > 4 

dụ khi tài liệu tham khảo có tên gọi khác nhau

SELECT g.id, COUNT(m.member_id) AS members 
FROM groups AS g 
LEFT JOIN group_members AS m ON g.id = m.group_id 
GROUP BY g.id 
HAVING members > 4 

Ngoài ra, hãy chắc chắn rằng bạn thiết lập các chỉ số bên trong giản đồ cơ sở dữ liệu của bạn cho các phím bạn đang sử dụng tại gia vì nó có thể ảnh hưởng đến hiệu suất trang web của bạn.

+0

tôi thay đổi các SQL để phù hợp với mã của tôi: 'CHỌN g.id, COUNT (m.id_profile) AS thành viên TỪ groups_main AS g LEFT JOIN groups_fans AS m SỬ DỤNG (id) GROUP BY g.id thành viên HAVING > 4' Kết quả trong lỗi MySQL này: "Cột không xác định 'id' trong 'từ khoản'. – hohner

+0

Bạn có thể sử dụng câu lệnh USING chỉ khi hai cột mang cùng tên, trong các trường hợp khác sử dụng lệnh ON tôi sẽ cập nhật câu trả lời của mình. – Nazariy

1

Bảng groups_main của bạn có cột khóa có tên id. Tôi tin rằng bạn chỉ có thể sử dụng cú pháp USING để tham gia nếu bảng groups_fans có cột khóa có cùng tên, có thể nó không có. Vì vậy, thay vào đó, hãy thử này:

LEFT JOIN groups_fans AS m ON m.group_id = g.id

Hoặc thay thế group_id với bất cứ tên cột thích hợp là trong bảng groups_fans.

22
SELECT DISTINCT groups.id, 
     (SELECT COUNT(*) FROM group_members 
     WHERE member_id = groups.id) AS memberCount 
FROM groups 
+0

Cảm ơn bạn rất nhiều .. Điều này đã giúp tôi đạt được những gì tôi đã cố gắng làm. –

+0

Điều này đã giúp tôi trong một truy vấn tôi đã đấu tranh với. Cảm ơn bạn. –

+0

Cảm ơn bạn đã chia sẻ mẹo hữu ích này. Tôi giúp tôi rất nhiều. Tôi đã được sử dụng như tìm thấy trong chức năng thiết lập. – Devsainii

0

Có thể tôi đã đánh dấu ở đây và không hiểu OP nhưng tại sao bạn tham gia bảng?

Nếu bạn có bảng có thành viên và bảng này có cột có tên "group_id", bạn chỉ có thể chạy truy vấn trên bảng thành viên để đếm số thành viên được nhóm theo nhóm_id.

SELECT group_id, COUNT(*) as membercount 
FROM members 
GROUP BY group_id 
HAVING membercount > 4 

Điều này sẽ có chi phí thấp nhất đơn giản chỉ vì bạn đang tránh tham gia nhưng vẫn nên cung cấp cho bạn những gì bạn muốn.

Nếu bạn muốn chi tiết nhóm và mô tả v.v., sau đó thêm nối từ bảng thành viên trở lại bảng nhóm để truy xuất tên sẽ cho bạn kết quả nhanh nhất.