sql >> Databáze >  >> RDS >> Mysql

OPUSTILI SE PO GROUP BY?

Dosud tu bylo několik dobrých odpovědí, ale zvolil bych trochu jinou metodu, která je velmi podobná té, kterou jste popsali původně

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

V tomto je poddotaz zodpovědný za řazení skladeb se značkami do 1 řádku na základě skladby. To se následně připojí k hlasům. Také jsem se rozhodl jednoduše sečíst sloupec v.votes, jak jste uvedli, že je 1 nebo 0, a proto SUM(v.votes) sečte 1+1+1+0+0 =3 z 5 jsou hlasy pro, zatímco SUM(1-v.hlas) bude součet 0+0+0+1+1 =2 z 5 jsou proti.

Pokud byste měli index hlasů se sloupci (id_song, vote), pak by se k tomu použil tento index, takže by se ani nedostal do tabulky. Podobně, pokud byste měli index na Songs_Tags s (id_song,id_tag), pak by tato tabulka nebyla dotazem zasažena.

upravit přidaný roztok pomocí count

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. Počet dalších řádků v tabulce se stejnou hodnotou

  2. Třídění dotazu MySQL pomocí ORDER BY nebo pomocí třídicích funkcí PHP

  3. 5 hlavních výhod migrace do Azure SQL Database

  4. Změna existujícího sloupce na vypočítaný sloupec na serveru SQL (příklad T-SQL)