il faut faire une sous-requête sur SONG_FILE, en récupérant le MAX de la valeur de track_type par song_id, et faire une jointure dessus.
Voici un jeu d'essai, sous Oracle (mais cela ne devrait poser aucun problème d'adaptation) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| CREATE TABLE SONG (
id NUMBER (4));
CREATE TABLE SONG_FILE (
id NUMBER (4),
song_id NUMBER (4),
track_type NUMBER (4));
INSERT INTO SONG VALUES (5400);
INSERT INTO SONG VALUES (3600);
INSERT INTO SONG_FILE VALUES (145, 5400, 3);
INSERT INTO SONG_FILE VALUES (146, 5400, 1);
INSERT INTO SONG_FILE VALUES (147, 5400, 1);
INSERT INTO SONG_FILE VALUES (178, 3600, 2);
INSERT INTO SONG_FILE VALUES (177, 3600, 1); |
Et la requête :
1 2 3 4 5 6 7 8 9 10
| SQL> SELECT sf.id, sf.song_id, sf.track_type
2 FROM SONG_FILE sf
3 WHERE sf.track_type = (SELECT MAX(track_type)
4 FROM SONG_FILE sfmax
5 WHERE sfmax.song_id = sf.song_id);
ID SONG_ID TRACK_TYPE
---------- ---------- ----------
145 5400 3
178 3600 2 |
Par contre, cette requête ne t'assure pas l'unicité de ton sf.id : en effet, si plusieurs enregistrements ont la même valeur pour le champ track_type, et que cette valeur correspond au MAX, alors tu récupéreras toutes ces lignes.
pour t'en convaincre, je rajoute cette ligne à mon jeu d'essais :
INSERT INTO SONG_FILE VALUES (148, 5400, 3);
Et voici le résultat :
1 2 3 4 5 6 7 8 9 10 11
| SQL> SELECT sf.id, sf.song_id, sf.track_type
2 FROM SONG_FILE sf
3 WHERE sf.track_type = (SELECT MAX(track_type)
4 FROM SONG_FILE sfmax
5 WHERE sfmax.song_id = sf.song_id);
ID SONG_ID TRACK_TYPE
---------- ---------- ----------
145 5400 3
178 3600 2
148 5400 3 |
Partager