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 :

Aide pour créer des jointures


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2021
    Messages : 10
    Par défaut Aide pour créer des jointures
    Bonjour et merci d'avance pour votre patience avec un bleu dans le domaine

    Voici déjà les 2 tables :
    albums :
    Nom : Tables Albums.PNG
Affichages : 163
Taille : 11,5 Ko
    auteurs :
    Nom : Tables Auteurs.PNG
Affichages : 148
Taille : 6,1 Ko

    1re étape : afficher les albums d'une série avec le N° du tome + le titre.
    Ci-dessous le code + affichage écran, si le code est bien écrit , ça marche.
    Code php : 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
    <?php
    // Connexion à la base
    	$base = mysql_connect ('xxxxxxx', 'xxxxxx', 'xxxxxx');
    	mysql_select_db ('xxxxxx', $base) ;
    ?>
    <html>
    <head>
    	<title>Albums de la série LONESOME</title>
    </head>
    <body>
    	<h1>LONESOME</h1>
    <?php
    // lancement de la requête
    $sql = 'SELECT num, numa, titre
    		FROM albums
    		WHERE idserie="1700"
    		ORDER BY num';
    // Lancement de la requête (mysql_query)
    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    // Scan des tuples un par un
    while ($data = mysql_fetch_array($req)) {
    // Affichage
    	echo 'Tome '.$data['num'].' ';
    	echo ' '.$data['numa'].' : ';
    	echo ''.$data['titre'].'<br />'; }
    mysql_free_result ($req);
    mysql_close ();
    ?>
    </body>
    </html>

    Nom : Etape_01.PNG
Affichages : 142
Taille : 5,4 Ko

    2nd étape : ajouter 1 ligne à l'affichage de l'étape 1 avec le nom et prénom du scénariste.
    finalement j'ajouterai le nom du dessinateur et coloriste.

    c'est la que je bloque. Je vais essayé d'être clair Si j'ai bien compris il va falloir utiliser des jointures.

    Dans la table "albums" : 1 colonne "idscenariste".
    Dans la table "auteurs" : 3 colonnes "idauteur", "nom" et "prenom".

    - "idauteur" de la table "auteurs" = "idscenariste". de la table "albums"
    - Valeur du champs "idauteur" et "idscenariste". = 695
    - Auteur : nom = Swolfs
    - Auteur : prénom = Yves

    Je veux finalement voir ceci :

    LONESOME

    Tome 1 : La piste du pêcheur
    Scénariste : Swolfs, Yves

    Tome 2 : Les ruffians
    Scénariste : Swolfs, Yves

    Tome 3 : Les liens du sang
    Scénariste : Swolfs, Yves

    Encore merci pour votre aide...

  2. #2
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2021
    Messages : 10
    Par défaut
    Voici mon 1er test qui me renvoi ceci :
    Nom : Test_01.PNG
Affichages : 109
Taille : 7,6 Ko

    avec le code :
    Code php : 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
    <?php
    // lancement de la requête
    $sql = 'SELECT num, numa, titre, idscenariste, idauteur, nom, prenom
    		FROM albums, auteurs
    		WHERE idserie="1700"
    		AND idscenariste = idauteur
    		ORDER BY num';
    // Lancement de la requête (mysql_query)
    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    // Scan des tuples un par un
    while ($data = mysql_fetch_array($req)) {
    // Affichage
    	echo 'Tome '.$data['num'].' ';
    	echo ' '.$data['numa'].' : ';
    	echo ''.$data['titre'].'<br />';
    	echo 'Scenariste : '.$data['idscenariste'].'<br /><br />'; }
    mysql_free_result ($req);
    mysql_close ();
    ?>

    Au final j'aimerai voir apparaitre le nom + prénom à la place de l'id de l'auteur, ici 695.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 637
    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 637
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    En effet, il faut utiliser une simple jointure interne :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select AL.num
         , AL.numa
         , AL.titre
         , AU.idauteur
         , AU.nom
         , AU.prenom
    from  albums  as AL
    inner join auteurs as AU
       on AU.idauteur=AL.idscenariste
    where AL.idserie=1700


    Quelques remarques :
    • la requête ne présentera pas les résultats comme souhaité, mais avec toutes les colonnes sur une seule ligne.
      C'est au traitement de faire la mise en forme
    • les cardinalités entre les tables ne sont pas bonnes : il est très fréquent qu'un ouvrage (qu'il s'agisse d'un film, d'un livre ou de tout autre média) ait plusieurs auteurs, plusieurs scénaristes, plusieurs dessinateurs...
    • la répétition de colonnes (et non pas de "champs") est exactement ce qu'il ne faut pas faire. Par exemple perso1, perso2, perso3 et perso4 ça ne va pas
    • si la colonne idserie est de type numérique, alors il ne faut pas mettre de quotes : where idserie=1700
    • si elle est de type char, alors ce sont de simples quotes et non des doubles qu'il faut utiliser : where idserie='1700'
    • l'ajout d'alias de table (FROM ... AS ....) facilite la compréhension de la requête : on sait d'emblée dans quelle table on récupère chaque colonne.

  4. #4
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2021
    Messages : 10
    Par défaut
    Merci escartefigue ,
    Je regarde ça et j'essaie d'ajouter le dessinateur et le coloriste.
    Est-ce possible d'ajouter 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INNER JOIN auteurs AS AU
    			ON AU.idauteur=AL.idscenariste
    avec AU.idauteur=AL.iddessinateur et AU.idauteur=AL.idcoloriste ?

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 637
    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 637
    Billets dans le blog
    10
    Par défaut
    on peut ajouter d'autres jointures bien entendu.

    Mais il faudrait surtout commencer, si possible, par revoir le modèle de données qui est complètement bancal.
    Un modèle de données bancal c'est des données dont l'intégrité est en danger, des fonctionnalités pauvres (par exemple : limitation du nombre d'auteurs), des performances très dégradées et des requêtes complexes.

  6. #6
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Novembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Autre
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2021
    Messages : 10
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Mais il faudrait surtout commencer, si possible, par revoir le modèle de données qui est complètement bancal.
    comment tu vois que c'est bancale ?

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 637
    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 637
    Billets dans le blog
    10
    Par défaut
    Exemples :
    1. le pseudo est dans la table AUTEUR, mais, un même auteur écrit parfois sous différents pseudo. Le pseudo est donc un attribut de l'ouvrage et non de l'auteur.
    2. avoir côte à côte dans la table ALBUM iddessinateur, idscénariste et idcoloriste
      si le document concerné n'a pas de dessinateur ou pas de coloriste la colonne correspondante est inutile
      si le document concerné a plusieurs scénaristes ou plusieurs dessinateurs, ce qui est très courant, on perd des informations
    3. avoir des colonnes nommées perso1, perso2... est également très suspect. S'il s'agit de stocker le nom de 4 personnages du livre, on tombe dans le même travers que le point précédent
    4. avoir mis le scénario dans la table AUTEUR implique qu'un auteur n'a qu'un et un seul scénario et qu'un scénario n'a qu'un seul auteur
    5. qu'est-ce qu'une colonne COULEUR vient faire dans une table AUTEUR...
    6. comme l'album possède une date d'achat, il faut comprendre que c'est un exemplaire d'album et non pas un livre : deux exemplaires pouvant être achetés à des dates différentes. Mais en ce cas, le titre du livre ne devrait pas apparaître ici car il faudra répéter le même titre à chaque exemplaire du même livre, d'où une redondance et un risque d'erreur, pareil pour les FK iddessinateur, idscénariste et idcoloriste qui ne doivent évidemment pas être positionnées dans l'exemplaire, mais dans le livre.
      Il faut bien distinguer
      - le livre : par exemple "les misérables" de Victor Hugo
      - l'édition : "les misérables" parue chez Grasset et l "les misérables" parue chez Galimard
      - l'exemplaire : "les misérables" paru chez Grasset et acheté dans la librairie "j'aime lire", rue tartempion à trifouilli les oies
    7. de plus le modèle est très pauvre, vous ne vous intéressez pas aux éditions ? Pas besoin du code marchand ISBN ? Ni de la "cote" bibliothèque (rien à voir avec le prix estimé, c'est un code de classement), etc. ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/10/2015, 15h31
  2. [XL-2007] Besoin d'aide pour créer un tableau qui va incrémenter automatiquement des onglets
    Par Bernardini dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 28/02/2015, 17h40
  3. Besoin d'aide pour créer des boutons de lecture
    Par bidays dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/07/2012, 19h51
  4. Réponses: 17
    Dernier message: 17/06/2012, 13h17
  5. demande d'aide pour créer des scripts en Javascript
    Par blueyes29 dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 28/12/2010, 20h52

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