Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

ग्रुप बाय के बाद बाएं शामिल हों?

अब तक कुछ अच्छे उत्तर मिले हैं, लेकिन मैं आपके द्वारा मूल रूप से वर्णित के समान ही थोड़ा अलग तरीका अपनाऊंगा

SELECT
    songsWithTags.*,
    COALESCE(SUM(v.vote),0) AS votesUp,
    COALESCE(SUM(1-v.vote),0) AS votesDown
FROM (
    SELECT
        s.*,
        COLLATE(GROUP_CONCAT(st.id_tag),'') AS tags_ids
    FROM Songs s
    LEFT JOIN Songs_Tags st
        ON st.id_song = s.id
    GROUP BY s.id
) AS songsWithTags
LEFT JOIN Votes v
ON songsWithTags.id = v.id_song

GROUP BY songsWithTags.id DESC

इसमें टैग के साथ गाने को 1 पंक्ति प्रति गीत के आधार पर जोड़ने के लिए सबक्वायरी जिम्मेदार है। इसके बाद इसे बाद में वोटों में शामिल किया जाता है। जैसा कि आपने संकेत दिया है कि यह 1 या 0 है और इसलिए एक SUM(v.votes) जोड़ देगा 1+1+1+0+0 =5 में से 3 अपवोट हैं। जबकि SUM(1-v.vote) का योग होगा 0+0+0+1+1 =5 में से 2 डाउनवोट हैं।

यदि आपके पास कॉलम (id_song, वोट) के साथ वोटों पर एक इंडेक्स था तो उस इंडेक्स का उपयोग इसके लिए किया जाएगा ताकि यह टेबल पर भी हिट न हो। इसी तरह यदि आपके पास Songs_Tags पर (id_song, id_tag) के साथ एक अनुक्रमणिका थी तो वह तालिका क्वेरी से प्रभावित नहीं होगी।

संपादित करें गिनती का उपयोग करके जोड़ा गया समाधान

SELECT
    songsWithTags.*,
    COUNT(CASE WHEN v.vote=1 THEN 1 END) as votesUp,
    COUNT(CASE WHEN v.vote=0 THEN 1 END) as votesDown
FROM (
    SELECT
        s.*,
        COLLATE(GROUP_CONCAT(st.id_tag),'') AS tags_ids
    FROM Songs s
    LEFT JOIN Songs_Tags st
        ON st.id_song = s.id
    GROUP BY s.id
) AS songsWithTags
LEFT JOIN Votes v
ON songsWithTags.id = v.id_song

GROUP BY songsWithTags.id DESC


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ई और ई (ई एक्यूट) के बीच MySQL भेद - अद्वितीय सूचकांक

  2. MySQL में समान प्राथमिक कुंजी को संदर्भित करने वाली 2 विदेशी कुंजी

  3. MySQL पर स्टोरेज इंजन टाइप कैसे बदलें?

  4. टॉमकैट 7.0.42 पूलिंग, हाइबरनेट 4.2, माइस्क्ल रॉक सॉलिड ऑटोरकनेक्ट सॉल्यूशन

  5. मॉड्यूल नॉटफाउंड त्रुटि:'mysql' नाम का कोई मॉड्यूल नहीं