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