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 :

SELECT sur des tables associatives


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut SELECT sur des tables associatives
    Bonjour,

    Je galère sur le SQL (MYSQL) car j'en ai fait très peu jusqu'à présent et je suis bloqué pour récupérer des données présentes sur plusieurs tables qui sont associées entre-elles par des tables associatives. De plus, j'ai beaucoup de mal à trouver mon exemple dans les tutos ou forums.

    Voici le schéma des tables en question :
    Nom : CaptVOIES.JPG
Affichages : 149
Taille : 76,2 Ko

    EXPLICATIONS :
    Pour comprendre le but, on prend une voie communale : rue du paradis....
    le mot 'rue' se trouvera dans la table 'TYPE_VOIE' et le mot 'du paradis' se trouvera dans la table 'NOM_VOIE'.

    Dans la table VOIE, j'aurais l'identifiant d'une voie et sa longueur.

    La table TYPER_VOIE me sert (normalement) à retrouver quel est le type de la voie pour un identifiant de voie. donc pour mon exemple --> rue

    La table NOMMER_VOIE me sert (normalement aussi) à retrouver quel est le nom de la voie pour un identifiant de voie. donc pour mon exemple --> du paradis.

    BUT :
    je souhaite sélectionner le type et le nom d'une voie à partir de l'identifiant de la voie présent dans la table VOIE.

    Pour l'instant, j'arrive à sélectionner le type ou le nom (voir sql ci-dessous) mais mon problème est de faire le lien avec les tables associatives.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT `typeVoie_type`
    	FROM `mairie`.`type_voie`
    	WHERE `mairie`.`type_voie`.`typeVoie_id` = 1;
    Le sql de construction de ma BDD est le suivant :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    -- phpMyAdmin SQL Dump
    -- version 4.2.11
    -- http://www.phpmyadmin.net
     
    -- Client :  127.0.0.1
    -- Généré le :  Mer 18 Février 2015 à 15:51
    -- Version du serveur :  5.6.21
    -- Version de PHP :  5.6.3
     
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
     
     
    -- Base de données :  `mairie`
     
    CREATE DATABASE IF NOT EXISTS `mairie` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
    USE `mairie`;
     
    -- Structure de la table `nommer_voie`
     
    CREATE TABLE IF NOT EXISTS `nommer_voie` (
      `Voie_voie_id` int(11) NOT NULL,
      `NOM_VOIE_nomVoie_id` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- Structure de la table `nom_voie`
     
    CREATE TABLE IF NOT EXISTS `nom_voie` (
      `nomVoie_id` int(11) NOT NULL,
      `nomVoie_nom` varchar(80) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- Structure de la table `typer_voie`
     
    CREATE TABLE IF NOT EXISTS `typer_voie` (
      `Voie_voie_id` int(11) NOT NULL,
      `TYPE_VOIE_typeVoie_id` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- Structure de la table `type_voie`
     
    CREATE TABLE IF NOT EXISTS `type_voie` (
      `typeVoie_id` int(11) NOT NULL,
      `typeVoie_type` varchar(20) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
     
    -- Structure de la table `voie`
     
    CREATE TABLE IF NOT EXISTS `voie` (
      `voie_id` int(11) NOT NULL,
      `voie_long` float DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- Index pour la table `nommer_voie`
     
    ALTER TABLE `nommer_voie`
     ADD PRIMARY KEY (`Voie_voie_id`,`NOM_VOIE_nomVoie_id`), 
     ADD KEY `FK_nommer_voie_VOIE` (`Voie_voie_id`), 
     ADD KEY `FK_nommer_voie_NOM_VOIE` (`NOM_VOIE_nomVoie_id`);
     
     -- Index pour la table `nom_voie`
     
    ALTER TABLE `nom_voie`
     ADD PRIMARY KEY (`nomVoie_id`);
    -- Index pour la table `typer_voie`
     
    ALTER TABLE `typer_voie`
     ADD PRIMARY KEY (`Voie_voie_id`,`TYPE_VOIE_typeVoie_id`), 
     ADD KEY `FK_Typer_voie_VOIE` (`Voie_voie_id`), 
     ADD KEY `FK_Typer_voie_TYPE_VOIE` (`TYPE_VOIE_typeVoie_id`);
     
     
    -- Index pour la table `type_voie`
     
    ALTER TABLE `type_voie`
     ADD PRIMARY KEY (`typeVoie_id`);
    -- Index pour la table `voie`
     
    ALTER TABLE `voie`
     ADD PRIMARY KEY (`voie_id`);
     
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    et voici quelques datas :
    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
    INSERT INTO `mairie`.`type_voie` (`typeVoie_id`, `typeVoie_type`) VALUES 
    	('1', 'rue'),
    	('2', 'allée'),
    	('3', 'impasse'),
    	('4', 'avenue'),
    	('5', 'chemin'),
    	('6', 'chemin rural'),
    	('7', 'route'),
    	('8', 'place'),
    	('9', 'square'),
    	('10', 'rond-point'),
    	('11', 'carrefour');
     
    INSERT INTO `mairie`.`nom_voie` (`nomVoie_id`, `nomVoie_nom`) VALUES
    	('1', 'Gérard'),
    	('2', 'beauciel'),
    	('3', 'principale'),
    	('4', 'écoles');
     
    INSERT INTO `mairie`.`voie` (`voie_id`, `voie_long`) VALUES
    	('1', '0,3'), 
    	('2', null);
     
    INSERT INTO `mairie`.`typer_voie` (`Voie_voie_id`, `TYPE_VOIE_typeVoie_id`) VALUES
    	('1', '3'), 
    	('2', '8');
     
    INSERT INTO `mairie`.`nommer_voie` (`Voie_voie_id`, `NOM_VOIE_nomVoie_id`) VALUES
    	('1', '2'), 
    	('2', '1');
    Je vous remercie de bien vouloir m'aider !
    OS : LinuxMint 20

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,


    lisez ceci : http://sqlpro.developpez.com/cours/sqlaz/jointures/


    Ceci étant dit vous pourriez aussi commencer par les 1er articles de ce même blog, au vue de la demande.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Bonjour,

    J'ai ouvert ce tutoriel SQL mais je ne le trouve pas bien expliqué !
    Je ne comprends pas car il n'y a pas les noms de tables indiqués et des colonnes présentes dans le SQL ne figurent pas dans la table mise en image.
    Par exemple, l'exmple 2, on voit la table T_TELEPHONE inscrit dans le sql, mais on n'a pas cette table en image.


    pour info, la requete suivante me donne une erreur #1054 - Unknown column 'nomVoie_nom' in 'field list' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT `typeVoie_type`, `nomVoie_nom` 
    	FROM `mairie`.`voie`, `mairie`.`typer_voie`, `mairie`.`type_voie`
    	WHERE `voie`.`voie_id` = `mairie`.`typer_voie`.`TYPE_VOIE_typeVoie_id`;
    Merci,
    OS : LinuxMint 20

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Bonjour,

    Je viens de réussir à connaître le type de voie à partir de l'identifiant de la voie
    Comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT `typeVoie_type`
    	FROM `mairie`.`voie`, `mairie`.`typer_voie`, `mairie`.`type_voie`
    	WHERE `mairie`.`type_voie`.`typevoie_id` = `typer_voie`.`TYPE_VOIE_typeVoie_id` 
        	AND `mairie`.`typer_voie`.`voie_voie_id` = `mairie`.`voie`.`voie_id`
            AND `mairie`.`voie`.`voie_id` = 2;
    et à connaître le nom de la voie à partir de l'identifiant de la voie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT `nomVoie_nom`
    	FROM `mairie`.`voie`, `mairie`.`nommer_voie`, `mairie`.`nom_voie`
    	WHERE `mairie`.`nom_voie`.`nomvoie_id` = `nommer_voie`.`voie_voie_id` 
        	AND `mairie`.`nommer_voie`.`nom_voie_nomvoie_id` = `mairie`.`voie`.`voie_id`
            AND `mairie`.`voie`.`voie_id` = 1;
    Et donc j'arrive à obtenir le type de la voie, puis le nom de la voie mais séparément ... il me reste plus qu'à joindre ces deux informations ....

    J'ai tenté ceci mais sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT `nomVoie_nom`, `typeVoie_type`
    	FROM `mairie_saubens`.`voie`, `mairie_saubens`.`nommer_voie`, `mairie_saubens`.`nom_voie`, `mairie_saubens`.`typer_voie`, `mairie_saubens`.`type_voie`
        WHERE(
            SELECT DISTINCT `nomVoie_nom`
    			FROM `mairie`.`voie`, `mairie`.`nommer_voie`, `mairie`.`nom_voie`
    			WHERE `mairie`.`nom_voie`.`nomvoie_id` = `nommer_voie`.`voie_voie_id` 
        			AND `mairie`.`nommer_voie`.`nom_voie_nomvoie_id` = `mairie`.`voie`.`voie_id`
            		AND `mairie`.`voie`.`voie_id` = 1;)
        AND(
            SELECT DISTINCT `typeVoie_type`
                FROM `mairie`.`voie`, `mairie`.`typer_voie`, `mairie`.`type_voie`
                WHERE `mairie`.`type_voie`.`typevoie_id` = `typer_voie`.`TYPE_VOIE_typeVoie_id` 
                    AND `mairie`.`typer_voie`.`voie_voie_id` = `mairie`.`voie`.`voie_id`
                    AND `mairie`.`voie`.`voie_id` = 1;)
    OS : LinuxMint 20

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Bonsoir,

    En fait j'aurais aimé sortir les deux résultats nom_voie et type_voie dans une même table, mais je pense que je peux exécuter deux requêtes séparément depuis le futur outils informatique et concaténer dans l'outil ....

    Merci !!!
    OS : LinuxMint 20

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    On ne dirait pas que vous êtes allé lire le tutoriel de SQLPro sur les jointures car vous y auriez vu une autre syntaxe de jointure utilisant l'opérateur JOIN et qui est la syntaxe normalisée depuis 1992, soit 23 ans !
    Si c'est votre prof qui vous a appris les jointures telles que vous les avez écrites, vous pouvez lui dire de notre part qu'il doit se recycler !

    Reprenons votre problème pourtant simple...
    je souhaite sélectionner le type et le nom d'une voie à partir de l'identifiant de la voie présent dans la table VOIE.
    Il faut donc faire une requête sur la table Voie en jointure avec les tables associatives, elles-mêmes en association avec les tables type_voie et nom_voie. Et comme une voie peut ne pas avoir de type (cardinalité 0,1), alors il faut une jointure externe vers typer_voie.

    Ce qui donne cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT tv.typeVoie_type AS type_voie,
        nv.nomVoie_nom AS nom_voie
    FROM Voie v
    INNER JOIN Nommer_voie j1 ON j1.voie_id = v.voie_id
        INNER JOIN NOM_VOIE nv ON nv.nomVoie_id = j1.nomVoie_id
    LEFT OUTER JOIN Typer_voie j2 ON j2.voie_id = v.voie_id
        LEFT OUTER JOIN TYPE_VOIE tv ON tv.typeVoie_id = j2.typeVoie_id
    WHERE v.voie_id = :voie_id
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Select avec 2 critères sur des tables reliées
    Par beyo dans le forum Requêtes
    Réponses: 4
    Dernier message: 07/12/2010, 15h03
  2. Réponses: 6
    Dernier message: 08/02/2007, 14h41
  3. selection sur une table en fonction de plusieurs ligne
    Par dimdidi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/12/2004, 08h42
  4. [8.0.5-->9.2.0.5] Checksum sur des tables oracle
    Par bobunny dans le forum Oracle
    Réponses: 9
    Dernier message: 24/11/2004, 12h46
  5. select sur plusieurs table, question sur jointure
    Par Schulman dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/09/2004, 13h54

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