Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur dans une jointure

    19 mai 2019 à 14:38:30

    bonjour,

    je cherche a faire une jointure

    je voudrais joindre trois tables: livre + edition + langue

    voici ma bdd

    -- phpMyAdmin SQL Dump
    -- version 4.5.4.1
    -- http://www.phpmyadmin.net
    --
    -- Client :  localhost
    -- Généré le :  Dim 12 Mai 2019 à 14:48
    -- Version du serveur :  5.7.11
    -- Version de PHP :  5.6.18
      
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
      
    --
    -- Base de données :  `owlbook`
    --
      
    -- --------------------------------------------------------
      
    --
    -- Structure de la table `categorie`
    --
      
    DROP TABLE IF EXISTS `categorie`;
    CREATE TABLE `categorie` (
      `id` int(11) NOT NULL,
      `nom` varchar(50) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
    -- --------------------------------------------------------
      
    --
    -- Structure de la table `edition`
    --
      
    DROP TABLE IF EXISTS `edition`;
    CREATE TABLE `edition` (
      `id` int(11) NOT NULL,
      `nom` varchar(150) NOT NULL,
      `date_publication` datetime NOT NULL,
      `isbn` varchar(150) NOT NULL,
      `nb_page` int(3) NOT NULL,
      `couverture` varchar(50) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
    --
    -- Contenu de la table `edition`
    --
      
    INSERT INTO `edition` (`id`, `date_publication`, `isbn`, `nb_page`, `couverture`) VALUES
    (2, '2019-05-12 00:00:00', 'test', 23, 'test');
      
    -- --------------------------------------------------------
      
    --
    -- Structure de la table `etat`
    --
      
    DROP TABLE IF EXISTS `etat`;
    CREATE TABLE `etat` (
      `id` int(11) NOT NULL,
      `nom` varchar(50) DEFAULT NULL,
      `description` varchar(255) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
    --
    -- Contenu de la table `etat`
    --
      
    INSERT INTO `etat` (`id`, `nom`, `description`) VALUES
    (2, 'Bon', 'Bon etat');
      
    -- --------------------------------------------------------
      
    --
    -- Structure de la table `genre`
    --
      
    DROP TABLE IF EXISTS `genre`;
    CREATE TABLE `genre` (
      `id` int(11) NOT NULL,
      `nom` varchar(50) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
    -- --------------------------------------------------------
      
    --
    -- Structure de la table `langue`
    --
      
    DROP TABLE IF EXISTS `langue`;
    CREATE TABLE `langue` (
      `id` int(11) NOT NULL,
      `locale` varchar(50) NOT NULL,
      `originale` varchar(50) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
    --
    -- Contenu de la table `langue`
    --
      
    INSERT INTO `langue` (`id`, `locale`, `originale`) VALUES
    (2, 'Francais', 'Anglais');
      
    -- --------------------------------------------------------
      
    --
    -- Structure de la table `librairie`
    --
      
    DROP TABLE IF EXISTS `librairie`;
    CREATE TABLE `librairie` (
      `id` int(11) NOT NULL,
      `nom` varchar(50) NOT NULL,
      `ville` varchar(50) NOT NULL,
      `codepostal` varchar(50) NOT NULL,
      `pays` varchar(50) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
    -- --------------------------------------------------------
      
    --
    -- Structure de la table `livre`
    --
      
    DROP TABLE IF EXISTS `livre`;
    CREATE TABLE `livre` (
      `id` int(11) NOT NULL,
      `titre` varchar(50) NOT NULL,
      `sousTitre` varchar(50) NOT NULL,
      `resume` varchar(255) NOT NULL,
      `image` varchar(25) NOT NULL,
      `etat` int(11) NOT NULL DEFAULT '0',
      `edition` int(11) NOT NULL DEFAULT '0',
      `mot_cle` varchar(255) NOT NULL,
      `langue` int(11) DEFAULT '0'
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
    --
    -- Contenu de la table `livre`
    --
      
    INSERT INTO `livre` (`id`, `titre`, `sousTitre`, `resume`, `image`, `etat`, `edition`, `mot_cle`, `langue`) VALUES
    (3, 'test', 'test test', 'test test test', 'test.jpg', 2, 2, 'test', 2);
      
    -- --------------------------------------------------------
      
    --
    -- Structure de la table `role`
    --
      
    DROP TABLE IF EXISTS `role`;
    CREATE TABLE `role` (
      `id` int(11) NOT NULL,
      `nom` varchar(100) DEFAULT NULL,
      `description` varchar(255) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
    -- --------------------------------------------------------
      
    --
    -- Structure de la table `serie`
    --
      
    DROP TABLE IF EXISTS `serie`;
    CREATE TABLE `serie` (
      `id` int(11) NOT NULL,
      `num` varchar(50) NOT NULL,
      `nom` varchar(50) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
    -- --------------------------------------------------------
      
    --
    -- Structure de la table `utilisateur`
    --
      
    DROP TABLE IF EXISTS `utilisateur`;
    CREATE TABLE `utilisateur` (
      `id` int(11) NOT NULL,
      `nom` varchar(50) NOT NULL,
      `prenom` varchar(50) NOT NULL,
      `email` varchar(50) NOT NULL,
      `password` varchar(255) NOT NULL,
      `adresse` varchar(255) NOT NULL,
      `codepostal` varchar(255) NOT NULL,
      `ville` varchar(50) DEFAULT NULL,
      `role` int(11) DEFAULT '0'
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
    --
    -- Contenu de la table `utilisateur`
    --
      
    INSERT INTO `utilisateur` (`id`, `nom`, `prenom`, `email`, `password`, `adresse`, `codepostal`, `ville`, `role`) VALUES
    (2, 'point test', 'test', 'test@test.test', '$2y$10$UDr86ZS/aMW7Hb11XE1CT.bBzlkXpaaqw.WCMtRV5R3LTtVbmXyVa', 'test', '12345', 'teste', 0);
      
    --
    -- Index pour les tables exportées
    --
      
    --
    -- Index pour la table `categorie`
    --
    ALTER TABLE `categorie`
      ADD PRIMARY KEY (`id`);
      
    --
    -- Index pour la table `edition`
    --
    ALTER TABLE `edition`
      ADD PRIMARY KEY (`id`);
      
    --
    -- Index pour la table `etat`
    --
    ALTER TABLE `etat`
      ADD PRIMARY KEY (`id`);
      
    --
    -- Index pour la table `genre`
    --
    ALTER TABLE `genre`
      ADD PRIMARY KEY (`id`);
      
    --
    -- Index pour la table `langue`
    --
    ALTER TABLE `langue`
      ADD PRIMARY KEY (`id`);
      
    --
    -- Index pour la table `librairie`
    --
    ALTER TABLE `librairie`
      ADD PRIMARY KEY (`id`);
      
    --
    -- Index pour la table `livre`
    --
    ALTER TABLE `livre`
      ADD PRIMARY KEY (`id`);
      
    --
    -- Index pour la table `role`
    --
    ALTER TABLE `role`
      ADD PRIMARY KEY (`id`);
      
    --
    -- Index pour la table `serie`
    --
    ALTER TABLE `serie`
      ADD PRIMARY KEY (`id`);
      
    --
    -- Index pour la table `utilisateur`
    --
    ALTER TABLE `utilisateur`
      ADD PRIMARY KEY (`id`);
      
    --
    -- AUTO_INCREMENT pour les tables exportées
    --
      
    --
    -- AUTO_INCREMENT pour la table `categorie`
    --
    ALTER TABLE `categorie`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
    --
    -- AUTO_INCREMENT pour la table `edition`
    --
    ALTER TABLE `edition`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
    --
    -- AUTO_INCREMENT pour la table `etat`
    --
    ALTER TABLE `etat`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
    --
    -- AUTO_INCREMENT pour la table `genre`
    --
    ALTER TABLE `genre`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
    --
    -- AUTO_INCREMENT pour la table `langue`
    --
    ALTER TABLE `langue`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
    --
    -- AUTO_INCREMENT pour la table `librairie`
    --
    ALTER TABLE `librairie`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
    --
    -- AUTO_INCREMENT pour la table `livre`
    --
    ALTER TABLE `livre`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
    --
    -- AUTO_INCREMENT pour la table `role`
    --
    ALTER TABLE `role`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
    --
    -- AUTO_INCREMENT pour la table `serie`
    --
    ALTER TABLE `serie`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
    --
    -- AUTO_INCREMENT pour la table `utilisateur`
    --
    ALTER TABLE `utilisateur`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

    et voici la jointure que j'ai fais : 

    SELECT
    
        req.titre AS livre,
    
       edition.nom AS edition,
    
       langue.originale AS langue,
    
       langue.locale AS langue
    
    FROM livre
    
    INNER JOIN edition
    
       ON livre.id = edition.id
    
    INNER JOIN langue
    
       ON livre.id = langue.originale
    
    INNER JOIN langue
    
       ON livre.id = langue.locale
    
    INNER JOIN (
    
       SELECT livre.id AS livre,
    
          edition.nom AS nom
    
       FROM langue
    
       INNER JOIN livre
    
          ON langue.id = livre.titre
    
    ) AS req
    
       ON req.livre = livre.id;

    et j'ai botenue ceci : #1066 - Table/alias: 'langue' non unique

    • Partager sur Facebook
    • Partager sur Twitter

    Merci à tous. Vous pouvez me retrouver ici :

    🌐 Visitez mon profil sur Comeup

    🚀 Découvrez BeFreelancr

    📱 Retrouvez-moi sur LinkedIn

      19 mai 2019 à 14:51:13

      Bonjour,

      Tu fais deux jointures sur la même table, comment espères-tu les distinguer ? (la réponse est dans les alias).

      • Partager sur Facebook
      • Partager sur Twitter
        19 mai 2019 à 15:10:00

        ok merci pour la réponse.

        sauf que je ne suis pas très doué en jointure.

        pourrais tu m'indiquer les options que j'aurais ?

        • Partager sur Facebook
        • Partager sur Twitter

        Merci à tous. Vous pouvez me retrouver ici :

        🌐 Visitez mon profil sur Comeup

        🚀 Découvrez BeFreelancr

        📱 Retrouvez-moi sur LinkedIn

          19 mai 2019 à 15:16:46

          ...INNER JOIN langue L1
           
             ON livre.id = L1.originale
           
          INNER JOIN langue L2
           
             ON livre.id = L2.locale
           ...
          • Partager sur Facebook
          • Partager sur Twitter
            19 mai 2019 à 15:27:08

            d'accord merci

            j'ai corrigé comme ceci :

            SELECT
                req.titre AS livre,
               edition.nom AS edition,
               langue.originale AS langue,
               langue.locale AS langue
            FROM livre
            INNER JOIN edition
               ON livre.id = edition.id
            INNER JOIN langue L1
               ON livre.id = L1.originale
            INNER JOIN langue L2
               ON livre.id = L2.locale
            INNER JOIN (
               SELECT livre.id AS livre,
                  edition.nom AS nom
               FROM langue
               INNER JOIN livre
                  ON langue.id = livre.titre
            ) AS req
               ON req.livre = livre.id;
            

            sauf que cette erreur est apparu :

            #1054 - Champ 'edition.nom' inconnu dans field list

            • Partager sur Facebook
            • Partager sur Twitter

            Merci à tous. Vous pouvez me retrouver ici :

            🌐 Visitez mon profil sur Comeup

            🚀 Découvrez BeFreelancr

            📱 Retrouvez-moi sur LinkedIn

              19 mai 2019 à 18:06:34

              Vraiment, tu ne vois pas ?

                 SELECT livre.id AS livre,
                    edition.nom AS nom
                 FROM langue
                 INNER JOIN livre
                    ON langue.id = livre.titre

              Tu ne sélectionnes même pas la table "edition".

              • Partager sur Facebook
              • Partager sur Twitter
                19 mai 2019 à 18:23:20

                je ne suis pas très doué en jointure comme je l'ai déja dit =)

                je ne comprends donc pas (dsl).

                ou edition n'est pas sélectionner ?

                • Partager sur Facebook
                • Partager sur Twitter

                Merci à tous. Vous pouvez me retrouver ici :

                🌐 Visitez mon profil sur Comeup

                🚀 Découvrez BeFreelancr

                📱 Retrouvez-moi sur LinkedIn

                  19 mai 2019 à 20:03:17

                  Pas douée, je veux bien, mais tu sais quand même que si tu veux récupérer la colonne "nom" de la table "edition", il faut sélectionner la table "edition" non ?

                  Là tu fais une jointure sur les tables "langue et "livre"...

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 mai 2019 à 21:16:25

                    oui c'est exacte

                    SELECT
                        req.titre AS livre,
                       edition.nom AS edition,
                       langue.originale AS langue,
                       langue.locale AS langue
                    FROM livre
                    INNER JOIN edition
                       ON livre.id = edition.id
                    INNER JOIN langue L1
                       ON livre.id = L1.originale
                    INNER JOIN langue L2
                       ON livre.id = L2.locale
                    INNER JOIN (
                       SELECT livre.id AS livre,
                          edition.nom AS nom
                       FROM langue
                       INNER JOIN livre
                          ON langue.id = livre.titre
                    ON edition.nom = livre.titre
                    ) AS req
                       ON req.livre = livre.id;


                    et comme ceci ?

                    -
                    Edité par AdServ 19 mai 2019 à 21:16:59

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Merci à tous. Vous pouvez me retrouver ici :

                    🌐 Visitez mon profil sur Comeup

                    🚀 Découvrez BeFreelancr

                    📱 Retrouvez-moi sur LinkedIn

                    erreur dans une jointure

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown