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

VENSTRE JOIN efter GROUP BY?

Der har været nogle gode svar indtil videre, men jeg ville bruge en lidt anden metode, der ligner den, du oprindeligt beskrev

SELECT songsWithTags.*, COALESCE(SUM(v.vote),0) AS votesUp, COALESCE(SUM(1-v.vote),0) AS votesDownFROM ( SELECT s.*, COLLATE(GROUP_CONCAT( st.id_tag),'') AS tags_ids FRA sange s LEFT JOIN Songs_Tags st ON st.id_song =s.id GROUP BY s.id) AS songsWithTagsLEFT JOIN Stemmer vON songsWithTags.id =v.id_songGROUP BY songs.id DESC kode>

I dette er underforespørgslen ansvarlig for at samle sange med tags i en række pr. sang. Dette tilføjes så til afstemninger efterfølgende. Jeg valgte også blot at opsummere v.votes-kolonnen, da du har angivet den er 1 eller 0, og derfor vil en SUM(v.votes) summere 1+1+1+0+0 =3 ud af 5 er up-stemmer, mens SUM(1-v.stemme) vil summere 0+0+0+1+1 =2 ud af 5 er nedstemmer.

Hvis du havde et indeks over stemmer med kolonnerne (id_song,vote), så ville det indeks blive brugt til dette, så det ikke engang ville ramme bordet. Ligeledes hvis du havde et indeks på Songs_Tags med (id_song,id_tag), ville den tabel ikke blive ramt af forespørgslen.

rediger tilføjet løsning ved hjælp af tæller

SELECT songsWithTags.*, COUNT(CASE WHEN v.vote=1 THEN 1 END) som stemmer op, COUNT(CASE WHEN v.vote=0 THEN 1 END) som votesDownFROM ( SELECT s.*, COLLATE( GROUP_CONCAT(st.id_tag),'') AS tags_ids FROM Sange s LEFT JOIN Songs_Tags st ON st.id_song =s.id GROUP BY s.id) AS songsWithTagsLEFT JOIN Stemmer vON songsWithTags.id =v.id_song DESCTAG BYs.  


  1. 'PDOException' med beskeden 'SQLSTATE[22001]:Strengdata, højre trunkeret:0

  2. MySQL Workbench - Sådan synkroniseres EER-diagrammet

  3. Ugyldigt datetime-format:1292 Forkert datetime-værdi

  4. Nummerseriegenerator-udfordringsløsninger – del 5