Mysql
 sql >> Baza danych >  >> RDS >> Mysql

LEFT JOIN po GROUP BY?

Do tej pory było kilka dobrych odpowiedzi, ale zastosowałbym nieco inną metodę, bardzo podobną do tej, którą opisałeś pierwotnie

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

W tym podzapytaniu odpowiadamy za porównywanie utworów z tagami w jeden wiersz na utwór. Następnie jest on dołączany do Głosów. Zdecydowałem się również po prostu podsumować kolumnę v.votes, ponieważ wskazałeś, że jest to 1 lub 0, a zatem SUMA (v.votes) doda 1+1+1+0+0 =3 z 5 to głosy za, podczas gdy SUM(1-v.vote) sumuje 0+0+0+1+1 =2 z 5 to głosy przeciw.

Gdybyś miał indeks głosów z kolumnami (id_song,vote), to ten indeks byłby do tego użyty, więc nawet nie trafiłby na tabelę. Podobnie, gdybyś miał indeks na Songs_Tags z (id_song,id_tag), wtedy ta tabela nie zostałaby trafiona przez zapytanie.

edytuj dodano rozwiązanie za pomocą licznika

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_fetch_array dodać wszystkie wiersze?

  2. MYSQL, bardzo powolne zamawianie przez

  3. Sortowanie SQL według pierwszych dwóch znaków pól

  4. MySQL FIND_IN_SET() nie działa zgodnie z oczekiwaniami

  5. Doctrine2:Nie można wybrać jednostki poprzez zmienne identyfikacyjne bez wybrania przynajmniej jednego aliasu jednostki głównej