मैं एक एकल SQL क्वेरी तैयार करने का प्रयास कर रहा हूं जो एक से कई संबंधों में एक तालिका की गणना करेगा। यहाँ मेरी स्कीमा का संक्षिप्त संस्करण है:
User(id)
Group(id)
UserGroup(user_id, group_id)
Post(id, user_id, group_id)
लक्ष्य एक समूह में प्रत्येक उपयोगकर्ता के लिए पदों की संख्या वापस करना है। मैं जिस विशिष्ट समस्या में चल रहा हूं वह यह है कि मेरी वर्तमान क्वेरी उस उपयोगकर्ता के लिए 0 वापस नहीं कर सकती है जिसके पास कोई पोस्ट नहीं है। यहाँ मेरी भोली क्वेरी है:
SELECT
COUNT(*) as total,
user_id
FROM
posts
WHERE
group_id = ?
GROUP BY user_id
ORDER BY
total DESC
यह ठीक काम करता है जब प्रत्येक उपयोगकर्ता के पास कोई पोस्ट होता है, लेकिन जब कुछ के पास कोई पोस्ट नहीं होता है, तो वे सूची में दिखाई नहीं देते हैं। मैं एक एकल प्रश्न कैसे लिख सकता हूं जो इस परिदृश्य को संभालता है और उक्त उपयोगकर्ताओं के लिए गिनती 0 देता है? मुझे पता है कि उपयोगकर्ताओं की सूची प्राप्त करने के लिए मुझे किसी तरह UserGroup
को शामिल करने की आवश्यकता है, लेकिन मैं वहीं से अटका हुआ हूं।
2 जवाब
एक left join
का प्रयोग करें:
SELECT u.id, COUNT(*) as total
FROM users u LEFT JOIN
posts p
ON p.user_id = u.id AND
p.group_id = ?
GROUP BY u.id
ORDER BY total DESC
मुझे लगता है कि मुझे मिल गया, लेकिन यह सुनिश्चित नहीं है कि कितना प्रदर्शनकारी है।
select count(p), u.id from users u left join (select * from workouts where group_id = ?) p on p.user_id = u.id where u.id in (select user_id from user_group where group_id = ?) group by u.id;
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।