Mysql
 sql >> Database >  >> RDS >> Mysql

SINISTRA UNISCITI dopo GROUP BY?

Finora ci sono state delle buone risposte, ma adotterei un metodo leggermente diverso, abbastanza simile a quello che hai descritto in origine

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

In questo la sottoquery è responsabile della raccolta di brani con tag in una riga per brano. Questo viene quindi unito a Voti in seguito. Ho anche scelto di riassumere semplicemente la colonna v.votes poiché hai indicato che è 1 o 0 e quindi un SUM (v.votes) aggiungerà 1+1+1+0+0 =3 su 5 sono voti positivi, mentre SUM(1-v.vote) sommerà 0+0+0+1+1 =2 su 5 sono voti negativi.

Se avessi un indice sui voti con le colonne (id_song,vote), allora quell'indice verrebbe utilizzato per questo in modo da non raggiungere nemmeno il tavolo. Allo stesso modo, se avessi un indice su Songs_Tags con (id_song, id_tag), quella tabella non sarebbe stata colpita dalla query.

modifica aggiunta soluzione utilizzando il conteggio

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