मैं एक एकल 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 को शामिल करने की आवश्यकता है, लेकिन मैं वहीं से अटका हुआ हूं।

0
lazyvar 5 अगस्त 2020, 02:30

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
0
Gordon Linoff 5 अगस्त 2020, 04:00

मुझे लगता है कि मुझे मिल गया, लेकिन यह सुनिश्चित नहीं है कि कितना प्रदर्शनकारी है।

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;

0
lazyvar 5 अगस्त 2020, 02:54