Ton modèle de données : Série -(1,n)----(1,1)- Saison -(1,n)----(1,1)- Episode
Je ne comprends pas pourquoi tu joins directement l'épisode à la série (sans passer par la saison) et pourquoi tu veux "et en regroupant les épisodes par saison". Si tu groupes par saison alors tu perds les épisodes.
Extraire les saisons et les épisodes d'une série et numéroter au global les épisodes :
SELECT ALL
ROW_NUMBER() OVER (ORDER BY S.seasonNumber ASC, E.episodeNumber ASC) AS globalNumber,
SN.seasonNumber, E.episodeNumber, E.episodeTitle
FROM SERIES AS S
INNER JOIN SEASON AS SN ON S.seriesId = SN.seriesId
INNER JOIN EPISODE AS E ON SN.seasonId = E.seasonId
WHERE S.seriedId = 123
ORDER BY 1 ASC, 2 ASC, 3 ASC
S'il y a un problème donne un échantillon de données et le résultat attendu.
Si "et en regroupant les épisodes par saison" est de l'affichage, ex.
Saison 1
--------------
1. 1. Titre épisode 1.1
2. 2. Titre épisode 1.2
3. 3. Titre épisode 1.3
Saison 2
--------------
4. 1. Titre épisode 2.1
5. 2. Titre épisode 2.2
6. 3. Titre épisode 2.3
7. 4. Titre épisode 2.4
...
Alors il faut traiter cela dans ta boucle d'affichage. PHP/PDO peut aider à grouper en faisant :
$sql = <<<SQL
SELECT ALL
SN.seasonNumber, -- Clef de groupement PHP/PDO sur la 1re colonne
ROW_NUMBER() OVER (ORDER BY S.seasonNumber ASC, E.episodeNumber ASC) AS globalNumber,
SN.seasonNumber, E.episodeNumber, E.episodeTitle
FROM SERIES AS S
INNER JOIN SEASON AS SN ON S.seriesId = SN.seriesId
INNER JOIN EPISODE AS E ON SN.seasonId = E.seasonId
WHERE S.seriedId = 123
ORDER BY 1 ASC, 2 ASC, 3 ASC
SQL;
$seasons = $pdo->query($sql)->fetchAll(PDO::FETCH_GROUP); // Permet de grouper automatiquement sur la 1re colonne du résultat
foreach ($seasons as $seasonNumber => $episodes) {
echo "Saison {$seasonNumber}\r\n";
echo "-------------------\r\n";
foreach ($episodes as $episode) {
echo "{$episode->globalNumber}. {$episode->episodeNumber}. {$episode->episodeTitle}\r\n";
}
}
Partager