IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête affichant les épisodes de séries TV


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Points : 78
    Points
    78
    Par défaut Requête affichant les épisodes de séries TV
    Bonjour,

    Je cherche à afficher la liste des épisodes des series TV affiché comme suit, en calculant le numéro global d'épisode (globalNumber) et en regroupant les épisodes par saison :

    | globalNumber | seasonNumber x epNumber | episodeTitle | frenchEpisodeTitle |

    Voici ma requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT ALL E.episodeNumber epNumber, E.seasonNumber seasonNumber, E.episodeTitle, E.frenchEpisodeTitle,
    		ROW_NUMBER() OVER (ORDER BY seasonNumber ASC, epNumber ASC) AS globalNumber
    	FROM EPISODE AS E
    	JOIN SERIES AS S ON S.seriesId = E.seriesId
    	JOIN SEASON AS SN ON SN.seriesId = S.seriesId
    	WHERE S.seriesId = 2
    	GROUP BY seasonNumber
    	ORDER BY globalNumber, seasonNumber, epNumber;

    Seulement voilà, ma requête ne m'affiche que le premier épisode de chaque série.

    Quelqu'un peut-il m'aider, s'il vous plait ?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 675
    Points
    39 675
    Billets dans le blog
    9
    Par défaut
    Je suppose qu'une série possède une à plusieurs saisons et qu'une saison possède un à plusieurs épisodes ? À confirmer.
    Du coup si la saison 1 comporte 10 épisodes, la saison 2 comporte 12 épisodes et que je suis sur l'épisode 4 de la saison 3, dois-je calculer 10+12+4 = 26 comme valeur d'épisode global ? Sinon quelle valeur faut il obtenir ?

    Note : votre SGBD est probablement MySQL / MariaDB, car le group by incohérent avec le select aurait provoqué une erreur avec n'importe quel autre SGBD

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Points : 78
    Points
    78
    Par défaut
    Effectivement, le SGBD est MariaDb.

    Je confirme, une série comporte un ou plusieurs saisons et 1 saison 1 ou plusieurs épisodes.

    Votre calcul du numéro d'épisode global est tout à fait correct.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 219
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 219
    Points : 8 455
    Points
    8 455
    Billets dans le blog
    17
    Par défaut
    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";
        }
    }
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 675
    Points
    39 675
    Billets dans le blog
    9
    Par défaut
    Vu le modèle de données, on a tout intérêt à identifier la saison relativement à la série, et l'épisode relativement à la saison.

    Le MCD devient donc :

    [SERIE] 1,n --- (paraitre) --- 1,1(R) [SAISON] 1, n --- (contenir) --- 1,1(R) [EPISODE]

    Ce qui donne le modèle tabulaire suivant (PK soulignées, FK suffixées #)
    SE_SERIE (SE_ident, SE_titre...)
    SA_SAISON(SE_ident#, SA_chrono, SA_datedeb, SA_datefin...)
    EP_episode(SE_ident#, SA_chrono#, EP_chrono, EP_titre...)

    Ce faisant, il suffit de compter les occurrence de EP_EPISODE pour une série :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count(*)
    from EP_episode
    where SE_ident =...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    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.
    J'aimerais afficher les épisodes de cette façon, en séparant les saison: :
    Nom : episodes.jpg
Affichages : 116
Taille : 900,9 KoNom : episodes.jpg
Affichages : 116
Taille : 900,9 Ko

    Saison 1
    1. 1-1. City of... Bienvenue à Los Angeles
    2. 1-2. Lonely Heart Angel fait équipe
    3. 1-3. In the Dark La pierre d'Amarra
    4. 1-4. I Fall to Pieces L'étrange Docteur Meltzer
    5. 1-5. Rm w/a Vu L'appartement de Cordelia
    Saison 2
    6. 2-1. Judgment Le jugement
    7. 2-2. Are You Now or Have You Ever Been L'hôtel du mal
    8. 2-3. First Impressions Premières impressions
    9. 2-4. Untouched Intouchable
    10. 2-5. Dear Boy Cher amour


    Je me retrouve avec une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DOException: SQLSTATE[HY093]: Invalid parameter number in /var/www/seriemaniacs/series/queries.php:475 Stack trace: #0 /var/www/seriemaniacs/series/queries.php(475): PDO->query() #1 /var/www/seriemaniacs/series/episodes.php(3): getEpisodes() #2 /var/www/seriemaniacs/accueil.php(77): require_once('...') #3 {main} thrown in /var/www/seriemaniacs/series/queries.php on line 475
    Voici comment j'utilise la requête. J'utilise cette forme de requête pour toutes les infos figurant sur les fiches Série :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    function getEpisodes() {
    	global $pdo;
    	global $seriesId;
     
    	$sql = <<<SQL
    	SELECT ALL
    	SN.seasonNumber,
    	ROW_NUMBER() OVER (ORDER BY SN.seasonNumber ASC, E.episodeNumber ASC) AS globalNumber,
    	SN.seasonNumber, E.episodeNumber AS epNumber, E.episodeTitle, E.frenchEpisodeTitle
    	FROM SERIES AS S
    	INNER JOIN SEASON AS SN ON S.seriesId = SN.seriesId
    	INNER JOIN EPISODE AS E ON SN.seasonNumber = E.seasonNumber
    	WHERE S.seriesId = :seriesId
    	ORDER BY 1 ASC, 2 ASC, 3 ASC
    	SQL;
     
     
          $seasons = $pdo->prepare($sql);
          $seasons->bindParam(':seriesId', $seriesId, PDO::PARAM_INT);
          $seasons->execute();
          $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_GROUP);
          $episodes = [];
          foreach ($rows as $row) {
             $episodes = [
                'globalNumber' => $row['globalNumber'],
                'seasonNumber' => $row['seasonNumber'],
                'epNumber' => $row['epNumber'],
                'episodeTitle' => $row['episodeTitle'],
                'frenchEpisodeTitle' => $row['frenchEpisodeTitle'],
             ];
     
             $episodeList[] = $episodes;
          }
     
          return $episodeList;
       }

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Vu le modèle de données, on a tout intérêt à identifier la saison relativement à la série, et l'épisode relativement à la saison.

    Le MCD devient donc :

    [SERIE] 1,n --- (paraitre) --- 1,1(R) [SAISON] 1, n --- (contenir) --- 1,1(R) [EPISODE]
    Ceci correspond à mon MCD.

    Mais le problème est que, avec ou sans SELECT COUNT, je ne parviens pas à afficher la totalité des épisodes.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 675
    Points
    39 675
    Billets dans le blog
    9
    Par défaut
    Ce besoin peut être satisfait en utilisant la fonction ROW_NUMBER() en partitionnant sur le niveau souhaité (saison ou série)

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2013
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 226
    Points : 78
    Points
    78
    Par défaut
    Bonsoir,

    J'ai trouvé la solution. En fait, je l'avais déjà. Voir ce post : https://www.developpez.net/forums/d2.../#post12028658

    Simplement, comme le faisait remarquer escartefigue, la clause GROUP BY était en trop.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Relations] afficher les relations entre 2 tables
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 14/01/2004, 17h07
  2. [web] comment afficher les erreur d'un cgi
    Par chtiboss dans le forum Web
    Réponses: 6
    Dernier message: 24/12/2003, 11h22
  3. [JTable] Comment ne pas afficher les titres ?
    Par FabienBxl dans le forum Composants
    Réponses: 3
    Dernier message: 08/10/2003, 15h01
  4. Comment afficher les accent sous mysql v4.0.13
    Par buildozer dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/06/2003, 09h33
  5. Afficher les bonnes facettes
    Par WormsHL-Groove dans le forum OpenGL
    Réponses: 3
    Dernier message: 26/08/2002, 21h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo