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

Schéma Discussion :

Modélisation d'une BdD séries TV


Sujet :

Schéma

  1. #41
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Au vu de votre dernière image (The Avengers), on peut ajouter une colonne periode dans l’en-tête de la table CASTING :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE CASTING
    (
       seriesId INT
     , characterId INT
     , personId INT
     , appearanceOrder SMALLINT not null
    ,  periode VARCHAR(9) not null
     , PRIMARY KEY(seriesId, personId, characterId)
     , UNIQUE(seriesId, characterId, appearanceOrder) /* clé alternative */
     , CONSTRAINT CASTING_SERIES_FK FOREIGN KEY(seriesId) REFERENCES SERIES(seriesId)
     , CONSTRAINT CASTING_PERSON_FK FOREIGN KEY(personId) REFERENCES PERSON(personId)
     , CONSTRAINT CASTING_CHAR_PLAYED_FK FOREIGN KEY(characterId) REFERENCES CHAR_PLAYED(characterId)
    );

    Quelques inserts :

    insert into CASTING (seriesId, personId, characterId, appearanceOrder, periode) values
       (  (select seriesId from SERIES where seriesTitle='Vingt ans dans un mur')
        , (select personId from PERSON where personName='Onésime Durand')
        , (select characterId from CHAR_PLAYED where characterName='Donald')
        , 1, '1939'
       )
     , (  (select seriesId from SERIES where seriesTitle='Vingt ans dans un mur')
        , (select personId from PERSON where personName='Onésime Durand')
       , (select characterId from CHAR_PLAYED where characterName='Mickey')
        , 2, '1940'
       )
     , (  (select seriesId from SERIES where seriesTitle='Vingt ans dans un mur')
        , (select personId from PERSON where personName='Yves-Xavier Dupont')
        , (select characterId from CHAR_PLAYED where characterName='Mickey')
        , 1, '1939'
       )
     , (  (select seriesId from SERIES where seriesTitle='Vingt ans dans un mur')
        , (select personId from PERSON where personName='Yves-Xavier Dupont')
        , (select characterId from CHAR_PLAYED where characterName='Donald')
        , 2, '1940'
       )
     , (  (select seriesId from SERIES where seriesTitle='The Avengers')
        , (select personId from PERSON where personName='Ian Hendry')
        , (select characterId from CHAR_PLAYED where characterName='Dr David Keeel')
        , 1, '1961' 
       )  
     , (  (select seriesId from SERIES where seriesTitle='The Avengers')
        , (select personId from PERSON where personName='Arthur Hewlett')
        , (select characterId from CHAR_PLAYED where characterName='Le Supérieur')
        , 1, '1961' 
       )  
     , (  (select seriesId from SERIES where seriesTitle='The Avengers')
        , (select personId from PERSON where personName='Paul Whitsum')
        , (select characterId from CHAR_PLAYED where characterName='Le Supérieur')
        , 2, '1962-1964'  
       )
     , (  (select seriesId from SERIES where seriesTitle='The Avengers')
        , (select personId from PERSON where personName='Patrick Newell')
        , (select characterId from CHAR_PLAYED where characterName='Le Supérieur')
        , 3, '1962-1964'  
       )
    ;
    Voyons voir :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select seriesTitle, characterName, personName, appearanceOrder, periode 
    from CASTING as c
    join SERIES as s on c.seriesId = s.seriesId
    join PERSON as p on c.personId = p.personId
    join CHAR_PLAYED as h on c.characterId = h.characterId 
    order by seriesTitle, characterName, appearanceOrder
    ;

    =>

    seriesTitle		characterName	personName	appearanceOrder	periode
    The Avengers		Dr David Keeel	Ian Hendry		1	1961
    The Avengers		Le Supérieur	Arthur Hewlett		1	1961
    The Avengers		Le Supérieur	Paul Whitsum		2	1962-1964
    The Avengers		Le Supérieur	Patrick Newell		3	1962-1964
    Vingt ans dans un mur	Donald		Onésime Durand		1	1939
    Vingt ans dans un mur	Donald		Yves-Xavier Dupont	2	1940
    Vingt ans dans un mur	Mickey		Yves-Xavier Dupont	1	1939
    Vingt ans dans un mur	Mickey		Onésime Durand		2	1940 
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  2. #42
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    A propos des périodes :


    Dans la série S et durant la période P, l’acteur A peut-il tenir le rôle de plus d’un personnage ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #43
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Merci encore une fois.

    Dans la série S et durant la période P, l’acteur A peut-il tenir le rôle de plus d’un personnage ?
    Non, dans ce cas de figure cela ne se produit pas.

    Effectivement, je risque d'avoir encore beaucoup d'épines à mon pieds, et peut-être même aux deux...

    Je cherche également à afficher, comme dans les exemples précédents, le pays la chaîne et l'année de première diffusion, mais cela pose problème.
    Je suis parvenu à afficher l'année de première diffusion française, mais pas la chaîne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT TW.seriesTitle AS frenchTitle, S.seriesTitle AS seriesTitle, S.releaseYear AS releaseYear, FS.frenchReleaseYear AS frenchReleaseYear, CH.channelName AS channelName FROM testview AS TW
    LEFT JOIN SERIES AS S ON S.seriesId = TW.seriesId
    LEFT JOIN FOREIGN_SERIES AS FS ON FS.seriesId = S.seriesId
    LEFT JOIN CHANNEL AS CH ON CH.channelId = S.channelId

  4. #44
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    testview est manifestement une vue, mais quel est le create view correspondant ?
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #45
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Effectivement, c'est une vue.

    Voici le CREATE VIEW :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE VIEW testview
    AS
    SELECT seriesId, frenchTitle AS seriesTitle FROM FOREIGN_SERIES
    UNION
    SELECT S.seriesId, S.seriesTitle AS seriesTitle FROM SERIES S
    JOIN FRENCH_SERIES F ON F.seriesId = S.seriesId;

  6. #46
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Je pense avoir trouvé une solution avec deux requêtes:

    Le premières pour les séries étrangères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT TW.seriesId, CY.countryName, CH.channelName, S.releaseYear FROM CHANNEL as CH
    LEFT JOIN SERIES AS S ON S.channelId = CH.channelId
    LEFT JOIN testview AS TW ON TW.seriesId = S.seriesId
    LEFT JOIN FOREIGN_SERIES AS FS ON FS.seriesId = S.seriesId
    LEFT JOIN COUNTRY AS CY ON CY.countryId = FS.countryId
    WHERE TW.seriesTitle LIKE "'.$_GET['series'].'"');
    La seconde pour les séries françaises:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT TW.seriesId, CH.channelName, FS.frenchReleaseYear FROM FOREIGN_SERIES as FS
    JOIN CHANNEL AS CH ON CH.channelId = FS.channelId
    JOIN testview AS TW ON TW.seriesId = FS.seriesId
    WHERE TW.seriesTitle LIKE "'.$_GET['series'].'"');

  7. #47
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Neelix
    Citation Envoyé par fsmrel
    Dans la série S et durant la période P, l’acteur A peut-il tenir le rôle de plus d’un personnage ?
    Non, dans ce cas de figure cela ne se produit pas.
    Si voulez interdire cette possibilité, vous pouvez ajouter la contrainte suivante dans l’instruction CREATE TABLE de la table CASTING :

    UNIQUE(seriesId, personId, periode)


    Citation Envoyé par Neelix
    Je cherche également à afficher, comme dans les exemples précédents, le pays la chaîne et l'année de première diffusion, mais cela pose problème.
    Je suis parvenu à afficher l'année de première diffusion française, mais pas la chaîne.
    Je n’ai peut-être pas compris exactement votre problème. En attendant, cette requête me paraît aller dans le bon sens :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select 'série étrangère' as 'origine' , seriesTitle, countryName, releaseYear
         , ch.channelName as foreignChannel, cf.channelName as frenchChannel
    from SERIES as s
    join CHANNEL as ch on s.channelId = ch.channelId
    join FOREIGN_SERIES as fs on fs.seriesId = s.seriesId
    join CHANNEL as cf on fs.channelId = cf.channelId
    join COUNTRY as cy on fs.countryId = cy.countryId
    UNION
    select 'série française', seriesTitle, 'France', releaseYear, '', channelName
    from SERIES as s
    join CHANNEL as c on s.channelId = c.channelId
    join FRENCH_SERIES as f on f.seriesId = s.seriesId
    ;

    =>

    Origine		seriesTitle		countryName		releaseYear	foreignChannel	frenchChannel
    série étrangère	BUGS			Grande-Bretagne		1995		BBC		M6
    série étrangère	The Avengers		Grande-Bretagne		1961		BBC		DVP
    série française	Vingt ans au plafond	France			1950				M6
    série française	Vingt ans dans un mur	France			1948				M6
    série française	Vingt ans dans un toit	France			1960				M6 
    Par référence au MCD, les OUTER JOIN sont à remplacer par de simples JOIN et la vue testview n’intervient pas.

    Pour mémoire, les valeurs utilisées :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into COUNTRY values
        ('France'), ('Grande-Bretagne'), ('Belgique'), ('Etats-Unis')
    ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into CHANNEL values
        ('BBC'), ('DVP'), ('M6')
    ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    insert into SERIES values
       ('BUGS', 1995, '/', (select channelId from CHANNEL where channelName = 'BBC'))
     , ('Vingt ans dans un mur', 1948, 'La vie d''une brique', (select channelId from CHANNEL where channelName = 'M6')) 
     , ('Vingt ans au plafond', 1950, 'La vie d''une poutre', (select channelId from CHANNEL where channelName = 'M6')) 
     , ('Vingt ans dans un toit', 1960, 'La vie d''une ardoise', (select channelId from CHANNEL where channelName = 'M6')) 
     , ('The Avengers', 1961, '', (select channelId from CHANNEL where channelName = 'BBC')) 
    ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    insert into FOREIGN_SERIES (seriesId, frenchReleaseYear, frenchTitle, frenchAka, channelId, countryId) 
    values
       (
          (select seriesId from SERIES where seriesTitle = 'BUGS'), 1996, 'Punaises', ''
        , (select channelId from CHANNEL where channelName = 'M6')
        , (select countryId from COUNTRY where countryName = 'Grande-Bretagne')
       )
     , (
          (select seriesId from SERIES where seriesTitle = 'The Avengers'), 1996, 'Chapeau melon', ''
        , (select channelId from CHANNEL where channelName = 'DVP')
        , (select countryId from COUNTRY where countryName = 'Grande-Bretagne')
       ) ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    insert into FRENCH_SERIES values
        (
          (select seriesId from SERIES where seriesTitle = 'Vingt ans dans un mur')
       )
     , (
          (select seriesId from SERIES where seriesTitle = 'Vingt ans au plafond')  
       ) 
     , (
          (select seriesId from SERIES where seriesTitle = 'Vingt ans dans un toit')  
       ) 
    ;
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  8. #48
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Si voulez interdire cette possibilité, vous pouvez ajouter la contrainte suivante dans l’instruction CREATE TABLE de la table CASTING :
    UNIQUE(seriesId, personId, periode)
    En rajoutant un index dans Looping comme décrit précédemment
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  9. #49
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Salve,

    Citation Envoyé par Paprick
    Citation Envoyé par fsmrel
    Si voulez interdire cette possibilité, vous pouvez ajouter la contrainte suivante dans l’instruction CREATE TABLE de la table CASTING :
    UNIQUE(seriesId, personId, periode)
    En rajoutant un index dans Looping comme décrit précédemment
    Petit problème :

    La patte connectant SERIES et CASTING sert déjà pour la construction de l’index composé défini pour l’attribut appearanceOrder. Comment agit-on sur cette patte pour faire participer SERIES au nouvel index défini pour l’attribut periode ?

    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  10. #50
    Membre émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Salut François,
    Citation Envoyé par fsmrel Voir le message
    Petit problème : La patte connectant SERIES et CASTING sert déjà pour la construction de l’index composé défini pour l’attribut appearanceOrder. Comment agit-on sur cette patte pour faire participer SERIES au nouvel index défini pour l’attribut periode ?
    J'espère que tu n'as pas douté un instant que la solution existait !
    Mais il est vrai que nous touchons là aux profondeurs de Looping : lorsqu'un élément est concerné par plusieurs index, il suffit de les écrire à la suite en les séparant par la barre verticale | (Alt Gr 6).
    Les possibilités sont alors illimitées !
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

  11. #51
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Ave Paprick,

    Certes, je n’ai pas douté que la solution existait, aussi avais-je essayé en séparant les noms des index par une virgule, puis un point-virgule... mais de là à découvrir tout seul qu’il s’agissait de la barre verticale...

    En tout cas, merci
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  12. #52
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Je n’ai peut-être pas compris exactement votre problème. En attendant, cette requête me paraît aller dans le bon sens :
    Votre requête va effectivement dans le bon sens, mais pose certains problèmes.

    Tout d'abord, elle est basée sur les titres originaux pour les séries étrangères, or, afin d'afficher une liste alphabétique de séries dans les pages correspondant à chaque lettre, je me base sur les titres français, puisque ce sont ceux-ci qui doivent apparaître dans les listes alphabétiques.

    Par ailleurs, j'ai modifié votre requête pour qu'apparaisse également l'année de sortie en France, du coup, les séries françaises n'apparaissent plus. En effet, il est du coup nécessaire d'utiliser des LEFT JOIN.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select 'série étrangère' as 'origine' , seriesTitle, countryName, releaseYear, frenchReleaseYear
         , ch.channelName as foreignChannel, cf.channelName as frenchChannel
    from SERIES as s
    left join CHANNEL as ch on s.channelId = ch.channelId
    left join FOREIGN_SERIES as fs on fs.seriesId = s.seriesId
    left join CHANNEL as cf on fs.channelId = cf.channelId
    left join COUNTRY as cy on fs.countryId = cy.countryId
    UNION
    select 'série française', seriesTitle, 'France', releaseYear, frenchReleaseYear, '', channelName
    from SERIES as s
    join FOREIGN_SERIES as fs on fs.seriesId = s.seriesId
    join CHANNEL as c on s.channelId = c.channelId
    join FRENCH_SERIES as f on f.seriesId = s.seriesId;
    Par contre, les requêtes que je vous ai soumises plus haut fonctionnent parfaitement en travaillant un peu mon code PHP avec une condition utilisant cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT S.seriesId FROM SERIES AS S
    JOIN FRENCH_SERIES AS F ON F.seriesId = S.seriesId
    WHERE S.seriesTitle LIKE "'.$_GET['series'].'" AND F.seriesId = S.seriesId
    J'espère que tu n'as pas douté un instant que la solution existait !
    Je ne doutait point non-plus qu'une solution exista, mais je ne l'aurais certes pas trouvée.

  13. #53
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    J'ai trouvé une solution qui fonctionne parfaitement en m'inspirant de la vue d'union que vous m'aviez suggérée ici.

    Je crée la vue suivante :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT FS.frenchTitle AS seriesTitle, CY.countryName AS countryName, S.releaseYear AS releaseYear, FS.frenchReleaseYear AS frenchReleaseYear, CH.channelName AS foreignChannel, CF.channelName AS frenchChannel FROM SERIES AS S
    JOIN CHANNEL AS CH ON CH.channelId = S.channelId
    JOIN FOREIGN_SERIES AS FS ON FS.seriesId = S.seriesId
    JOIN CHANNEL AS CF ON CF.channelId = FS.channelId
    JOIN COUNTRY AS CY ON CY.countryId = FS.countryId
    UNION
    SELECT S.seriesTitle AS seriesTitle, 'France', S.releaseYear AS releaseYear, FS.frenchReleaseYear AS frenchReleaseYear, '', C.channelName AS channelName FROM FRENCH_SERIES AS F
    LEFT JOIN SERIES AS S ON S.seriesId = F.seriesId
    LEFT JOIN FOREIGN_SERIES AS FS ON FS.seriesId = S.seriesId
    JOIN CHANNEL AS C ON C.channelId = S.channelId;
    puis j'utilise les requêtes suivantes:

    Pour les séries étrangères:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT TW.seriesId, CY.countryName, CH.channelName, S.releaseYear FROM CHANNEL as CH
    LEFT JOIN SERIES AS S ON S.channelId = CH.channelId
    LEFT JOIN testview AS TW ON TW.seriesId = S.seriesId
    LEFT JOIN FOREIGN_SERIES AS FS ON FS.seriesId = S.seriesId
    LEFT JOIN COUNTRY AS CY ON CY.countryId = FS.countryId
    WHERE TW.seriesTitle LIKE "'.$_GET['series'].'"

    Pour les séries françaises:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT TW.seriesId, CH.channelName, FS.frenchReleaseYear FROM FOREIGN_SERIES as FS
    JOIN CHANNEL AS CH ON CH.channelId = FS.channelId
    JOIN testview AS TW ON TW.seriesId = FS.seriesId
    WHERE TW.seriesTitle LIKE "'.$_GET['series'].'"

  14. #54
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Neelix
    Je me base sur les titres français, puisque ce sont ceux-ci qui doivent apparaître dans les listes alphabétiques.
    D’accord. Dans la requête que j’ai proposée, concernant les séries étrangères, il suffit alors de remplacer seriesTitle par frenchTitle et releaseYear par frenchReleaseYear. Comme le canal étranger n’est plu concerné, on supprime la jointure correspondate (join CHANNEL as ch on s.channelId = ch.channelId) ainsi que la référence qui y est faite (ch.channelName as foreignChannel).

    la requête devient donc :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select 'série étrangère' as 'origine', frenchTitle, countryName, frenchReleaseYear, cf.channelName as frenchChannel
    from SERIES as s
    join FOREIGN_SERIES as fs on fs.seriesId = s.seriesId
    join CHANNEL as cf on fs.channelId = cf.channelId
    join COUNTRY as cy on fs.countryId = cy.countryId
    UNION
    select 'série française', seriesTitle, 'France', releaseYear, channelName
    from SERIES as s
    join CHANNEL as c on s.channelId = c.channelId
    join FRENCH_SERIES as f on f.seriesId = s.seriesId ;
    =>

    origine		frenchTitle		countryName	frenchReleaseYear	frenchChannel
    série étrangère	Chapeau melon		Grande-Bretagne	1996			DVP
    série étrangère	Punaises		Grande-Bretagne	1996			M6
    série française	Vingt ans au plafond	France		1950			M6
    série française	Vingt ans dans un mur	France		1948			M6
    série française	Vingt ans dans un toit	France		1960			M6 
    Toujours pas besoin d’outer join...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  15. #55
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Non, cela ne va toujours pas, puisque le but de cette requête est d'afficher Pays, chaîne et année de première diffusion pour le pays d'origine ET chaîne et année de première diffusion pour la France.

    Or, la requête que vous me proposez maintenant ne permet d'afficher ces caractéristiques que pour la France.

  16. #56
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Bonjour,

    Citation Envoyé par Neelix
    Je cherche également à afficher, comme dans les exemples précédents, le pays la chaîne et l'année de première diffusion, mais cela pose problème.
    Je suis parvenu à afficher l'année de première diffusion française, mais pas la chaîne.
    ...

    Citation Envoyé par Neelix
    Je me base sur les titres français, puisque ce sont ceux-ci qui doivent apparaître dans les listes alphabétiques.
    ...

    Citation Envoyé par Neelix
    Cela ne va toujours pas, puisque le but de cette requête est d'afficher Pays, chaîne et année de première diffusion pour le pays d'origine ET chaîne et année de première diffusion pour la France.
    Or, la requête que vous me proposez maintenant ne permet d'afficher ces caractéristiques que pour la France.
    On tourne en rond, on est dans l’ambiguïté, voire la contradiction. Comme j’ai pris la peine de le faire à chaque fois, présentez un résultat de ce que vous attendez, sous forme de tableau : liste des noms de colonnes et les lignes contenant les valeurs obtenues par SELECT.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  17. #57
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    On tourne en rond, on est dans l’ambiguïté, voire la contradiction.
    Effectivement, j'en conviens volontiers.

    Voici le résultat escompté:
    seriesTitle         countryName releaseYear frenchReleaseYear   channel frenchChannel	
    McGyver             USA         1984        1988                ABC     FR3	
    Stargate: SG-1	    USA         1998	    2000                ITV     TF6	
    La vie de famille   USA         1990	    1999                ABC     FR3	
    Notre belle famille USA         1998	    1999                ABC     TF1	
    Bugs                G.B.        1995	    1996                CBS     M6	
    Brigade de nuit     USA         1985	    1983                M6      ATV	
    7 jours pour agir   USA         1999	    2001                ABC     FR3	
    Chapeau melon       G.B.        1975	    1977                BBC     A2	
    Maguy               France      1983	                        FR3		
    
    Par contre, afin d'éviter toute ambiguité dans mon code, j'ai laisser tomber les requêtes utilisant le titre d'un série. J'utilise plutôt "seriesId", qui limite de beaucoup le risque d'erreur.

  18. #58
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Bonsoir Neelix,

    Merci pour le tableau, j’interprète mieux le besoin...

    J’utilise une vue, par exemple pour faire des order by. Quelque chose comme ça, ça devrait aller mieux :

    create view TableauSeries (seriesTitle, countryName, releaseYear, frenchReleaseYear, channel, frenchChannel)
    as
    select frenchTitle, countryName, releaseYear, cast(frenchReleaseYear as char(4)), h.channelName, h2.channelName
    from SERIES as s
    join CHANNEL as h on s.channelId = h.channelId
    join FOREIGN_SERIES as f on f.seriesId = s.seriesId
    join CHANNEL as h2 on f.channelId = h2.channelId
    join COUNTRY as c on f.countryId = c.countryId
    
    UNION
    
    select seriesTitle, 'France', releaseYear, '', channelName, ''
    from SERIES as s
    join CHANNEL as c on s.channelId = c.channelId
    join FRENCH_SERIES as f on f.seriesId = s.seriesId
    ;
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from TableauSeries
    order by countryName 
    ;

    =>

     
    seriesTitle		countryName	releaseYear	frenchReleaseYear	channel	frenchChannel
    Maguy			France		1983					FR3	
    Vingt ans au plafond	France		1950					M6	
    Vingt ans dans un mur	France		1948					M6	
    Vingt ans dans un toit	France		1960					M6	
    Chapeau melon		G.B		1975		1977			BBC	A2
    Punaises		G.B		1995		1996			BBC	M6
    Le McGyver		USA		1984		1988			ABC	FR3
    
    Toujours pas d’outer join...

    A suivre
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  19. #59
    Membre du Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Nous y voici. C'est exactement ce que je cherchais. Je pense que cette fois ça y'est, il ne ma reste plus qu'à peupler ma base de données.
    Ce qui risque d'être le plus fastidieux.

    Merci à tous.

  20. #60
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Bonjour

    Il est préférable de coder UNION ALL plutôt que UNION.

    UNION seul demande un dédoublonnage par le moteur du SGBD ce qui prend du temps.
    Comme ici il n'y a pas de doublon possible (countryName oblige), le dédoublonnage est inutile

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Quels logiciels de modélisation pour une base de données ?
    Par octopus dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 11/06/2023, 16h20
  2. Réponses: 0
    Dernier message: 30/01/2013, 22h27
  3. Modélisation d'une BDD
    Par kaiser21 dans le forum UML
    Réponses: 2
    Dernier message: 09/03/2012, 14h40
  4. Outils pour modéliser le Schéma d'une BDD ?
    Par Tchupacabra dans le forum Outils
    Réponses: 7
    Dernier message: 20/05/2008, 16h43
  5. connection a une BDD MySql
    Par delire8 dans le forum MFC
    Réponses: 7
    Dernier message: 19/06/2002, 18h18

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