2011-01-31 21 views
23

मेरे पास दो टेबल हैं: groups और group_membersMySQL जुड़ता है और COUNT (*) किसी अन्य तालिका से

groups तालिका में इस तरह के अपने आईडी, शीर्षक, विवरण, आदि

group_members तालिका में के रूप में प्रत्येक समूह के लिए सभी जानकारी, शामिल है, यह सब सदस्यों को जो इस तरह प्रत्येक समूह के अलग होते हैं, जिन्हें:

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

असल में, मैं एक पृष्ठ पर तीन समूहों को सूचीबद्ध करना चाहता हूं, और मैं केवल उन समूहों को सूचीबद्ध करना चाहता हूं जिनमें चार से अधिक सदस्य हैं। <?php while ?> लूप के अंदर, मैं उस समूह के अलग-अलग चार सदस्यों को चाहता हूं। मुझे समूहों को सूचीबद्ध करने में कोई परेशानी नहीं है, और सदस्यों को किसी अन्य आंतरिक लूप में सूचीबद्ध करना है, मैं केवल समूहों को परिष्कृत नहीं कर सकता हूं ताकि केवल 4 से अधिक सदस्यों के साथ ही दिखाया जा सके।

क्या कोई यह जानता है कि यह कैसे करें? मुझे यकीन है कि यह MySQL में शामिल है।

उत्तर

49

MySQL इस कार्यों के लिए HAVING कथन का उपयोग करें।

आपकी क्वेरी इस प्रकार दिखाई देगा:

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 

उदाहरण है जब संदर्भ अलग-अलग नामों

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 

भी है, सुनिश्चित करें कि आप चाबियाँ आप में जुड़ उपयोग कर रहे हैं के लिए अपने डेटाबेस स्कीमा के अंदर अनुक्रमित सेट है कि क्योंकि यह आपकी साइट के प्रदर्शन को प्रभावित कर सकता है।

+0

मैं एसक्यूएल बदल मेरी कोड फिट करने के लिए: के रूप में जी वाम groups_main 'g.id का चयन करें, COUNT (m.id_profile) के सदस्यों के रूप में प्रयोग मीटर के रूप में groups_fans शामिल हों (आईडी) ग्रुप द्वारा होने सदस्यों g.id > 4' इस MySQL त्रुटि में परिणाम: 'खंड से' अज्ञात कॉलम 'आईडी'। – hohner

+0

आप केवल यूएस कॉलिंग का उपयोग केवल तभी कर सकते हैं जब दो कॉलम समान नाम रखते हैं, अन्य मामलों में ऑन कथन का उपयोग करें, मैं अपना जवाब अपडेट करूंगा। – Nazariy

1

आपकी groups_main तालिका में id नामक एक प्रमुख कॉलम है। मेरा मानना ​​है कि आप groups_fans तालिका में एक ही नाम के साथ एक महत्वपूर्ण कॉलम है, जो संभवतः नहीं है, तो आप शामिल होने के लिए केवल USING वाक्यविन्यास का उपयोग कर सकते हैं। बजाय, इस प्रयास करें:

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

या के साथ जो कुछ भी उचित स्तंभ नाम groups_fans तालिका में है group_id बदलें।

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

बहुत बहुत धन्यवाद .. इससे मुझे वह करने में मदद मिली जो मैं करने की कोशिश कर रहा था। –

+0

इससे मुझे एक प्रश्न में मदद मिली जिसमें मैं संघर्ष कर रहा था। धन्यवाद। –

+0

इस उपयोगी चाल को साझा करने के लिए धन्यवाद। मैं बहुत मदद करता हूँ। मैं सेट फंक्शन में खोजने के रूप में इस्तेमाल किया गया था। – Devsainii

0

शायद मैं यहां चिह्न से बाहर हूं और ओपी को समझ नहीं रहा हूं लेकिन आप तालिकाओं में क्यों शामिल हो रहे हैं?

यदि आपके पास सदस्यों के साथ एक टेबल है और इस तालिका में "group_id" नामक एक कॉलम है, तो आप group_id द्वारा समूहित सदस्यों की गिनती करने के लिए सदस्यों की तालिका पर केवल एक क्वेरी चला सकते हैं।

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

यह कम से कम ओवरहेड होना चाहिए क्योंकि आप शामिल होने से बच रहे हैं लेकिन आपको अभी भी जो चाहिए था उसे देना चाहिए।

यदि आप समूह विवरण और विवरण इत्यादि चाहते हैं, तो नाम पुनर्प्राप्त करने के लिए सदस्यों की तालिका में समूह तालिका में शामिल होने से आपको सबसे तेज़ परिणाम मिल जाएगा।

संबंधित मुद्दे