Partage
  • Partager sur Facebook
  • Partager sur Twitter

[MySQL][PDO] Effectuer une requête sur deux tables.

Sujet résolu
    23 juin 2011 à 0:37:43

    Pas si simple que ça...

    Voici la configuration de mes tables: (Je donne le script SQL pour ceux qui voudraient l'importer)
    --
    -- Structure de la table `grp2_article`
    --
    
    CREATE TABLE IF NOT EXISTS `grp2_article` (
      `ID_ARTICLE` int(11) NOT NULL AUTO_INCREMENT,
      `TITRE` char(40) NOT NULL,
      `DESCRIPTIF` text NOT NULL,
      `PRIX` float(8,2) NOT NULL,
      `IMAGE` text NOT NULL,
      `STOCK` int(11) NOT NULL,
      `EXCLUSIVITE` tinyint(1) NOT NULL COMMENT '1: Produit exclusif | 0: Produit non exclusif',
      `AUTEUR` char(50) NOT NULL,
      `DUREE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
      `DATE_PARUTION` date NOT NULL,
      `URL` char(255) NOT NULL,
      `QTE_SEUIL` int(11) NOT NULL,
      PRIMARY KEY (`ID_ARTICLE`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
    
    
    --
    -- Structure de la table `grp2_article_types`
    --
    
    CREATE TABLE IF NOT EXISTS `grp2_article_types` (
      `ID_TYPES` char(30) NOT NULL,
      `ID_ARTICLE` int(11) NOT NULL,
      PRIMARY KEY (`ID_TYPES`,`ID_ARTICLE`),
      KEY `FK_GRP2_ARTICLE_TYPE` (`ID_ARTICLE`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    --
    -- Contenu de la table `grp2_article`
    --
    
    INSERT INTO `grp2_article` (`ID_ARTICLE`, `TITRE`, `DESCRIPTIF`, `PRIX`, `IMAGE`, `STOCK`, `EXCLUSIVITE`, `AUTEUR`, `DUREE`, `DATE_PARUTION`, `URL`, `QTE_SEUIL`) VALUES
    (1, 'Avatar', 'Sur la lointaine plan', 18.00, '', 0, 0, 'James Cameron', '2011-06-21 02:42:00', '2010-04-21', 'http://video.fnac.com/a2791870/Avatar-Sam-Worthington-DVD-Zone-2', 0),
    (2, 'Cars', 'Star montante des courses automobiles, Flash McQueen, splendide petit bolide rouge, est aussi arrogant et ', 12.00, '', 0, 0, 'John Lasseter', '2011-06-21 01:52:00', '2006-12-14', 'http://video.fnac.com/a1891843/Cars-DVD-Zone-2', 0),
    (3, '2012', 'En 2009, un scientifique indien (Jimi Mistry) fait une d', 10.00, '', 0, 0, 'Roland Emmerich', '2011-06-21 02:02:00', '2010-03-11', 'http://video.fnac.com/a2804658/2012-John-Cusack-DVD-Zone-2', 0),
    (4, 'Inception', 'R', 10.00, '', 0, 0, 'Christopher Nolan', '2011-06-21 02:28:00', '2010-12-08', 'http://video.fnac.com/a3003941/Inception-Leonardo-DiCaprio-DVD-Zone-2', 0),
    (5, 'Iron man', 'Kidnapp', 12.00, '', 0, 0, 'Jon Favreau', '2011-06-21 01:50:00', '2008-11-05', 'http://video.fnac.com/a2465645/Iron-Man-Edition-Simple-Robert-Downey-Jr-DVD-Zone-2', 0),
    (6, 'Get your heart on', 'you suck at love\r\ncan''t keep my hands off...\r\nJet lag\r\nAstronaut\r\nLoser of the year\r\nAnywhere else but here\r\nFreaking me out\r\nSummer paradise\r\nGone too soon\r\nLast one standing\r\nThis song saved my life\r\nJet lag', 13.00, '', 0, 0, 'Simple Plan', '2011-06-21 01:20:00', '2011-06-20', 'http://musique.fnac.com/a3583682/Simple-Plan-Get-your-heart-on-CD-album', 0),
    (7, 'Sorry for party rocking', 'Rock the beat II\r\nSorry for party rocking\r\nParty rock anthem\r\nSexy and i know it\r\nChampagne showers\r\nOne day\r\nPut that ass to work\r\nTake it to the hole\r\nWe came here to party\r\nReminds me of you\r\nBest night\r\nAll night long\r\nWith you\r\nHot dog\r\nI am in Miami bitch\r\nShots', 12.00, '', 0, 0, 'Lmfao', '0000-00-00 00:00:00', '2011-06-20', 'http://musique.fnac.com/a3610597/Lmfao-Sorry-for-party-rocking-CD-album', 0);
    
    
    
    
    --
    -- Contenu de la table `grp2_article_types`
    --
    
    INSERT INTO `grp2_article_types` (`ID_TYPES`, `ID_ARTICLE`) VALUES
    ('Action', 1),
    ('Dvd', 1),
    ('Nouveaute', 1),
    ('Animation', 2),
    ('Dvd', 2),
    ('Aventure', 3),
    ('Dvd', 3),
    ('Action', 4),
    ('Dvd', 4),
    ('Action', 5),
    ('Aventure', 5),
    ('Dvd', 5),
    ('Cd album', 6),
    ('Metal', 6),
    ('Nouveaute', 6);
    
    
    --
    -- Contraintes pour la table `grp2_article_types`
    --
    ALTER TABLE `grp2_article_types`
      ADD CONSTRAINT `FK_GRP2_ARTICLE_TYPE` FOREIGN KEY (`ID_ARTICLE`) REFERENCES `grp2_article` (`ID_ARTICLE`),
      ADD CONSTRAINT `FK_GRP2_ARTICLE_TYPE2` FOREIGN KEY (`ID_TYPES`) REFERENCES `grp2_types` (`ID_TYPES`);
    


    Voici, en français, ce que je veux faire:

    Je souhaite récupérer tous les champs des tables grp2_article et grp2_article_types pour lesquelles il y a dans grp2_article_types l'ID_TYPES 'Nouveaute' et l'ID_TYPES 'Dvd'.

    Pour le moment voici ma requête SQL:

    SELECT * FROM `grp2_article` NATURAL JOIN grp2_article_types WHERE ID_TYPES = 'Nouveaute';

    Si je rajoute "AND ID_TYPES = 'Dvd';" à la fin, ca ne fonctionne pas, normal, j'ai pas d'ID TYPES qui vaut en même temps 'Nouveaute' et 'Dvd'...

    Donc je coince ! Je sais pas si je dois faire un select dans un autre ou un truc bien plus simple, trou de mémoire...

    Si vous pouvez m'aider, ce serait fort apprécié :)
    Je vous remercie.
    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2011 à 3:00:28

      Moi aussi ça m'intéresse s'il y a une façon de faire autre qu'une double jointure.
      SELECT * FROM `grp2_article` a
          JOIN grp2_article_types t1 ON t1.ID_ARTICLE = a.ID_ARTICLE
          JOIN grp2_article_types t2 ON t2.ID_ARTICLE = a.ID_ARTICLE
      WHERE t1.ID_TYPES = 'Nouveaute' AND t2.ID_TYPES = 'Dvd';
      
      • Partager sur Facebook
      • Partager sur Twitter
        23 juin 2011 à 8:03:11

        Il est possible de faire comme ça ?
        Je testerais ^^ Merci :)

        C'est un peu lourd, mais ça pourrait le faire.
        • Partager sur Facebook
        • Partager sur Twitter
          23 juin 2011 à 9:07:10

          Salut
          Il suffit d'utiliser le group by et conservé les lignes ayant plus d'un résultat
          SELECT ID_ARTICLE, TITRE, DESCRIPTIF, PRIX, IMAGE, STOCK, EXCLUSIVITE, AUTEUR, 	DUREE, DATE_PARUTION,  URL, QTE_SEUIL
          FROM `grp2_article` NATURAL JOIN grp2_article_types 
          WHERE id_types in ("Nouveaute",  "Dvd") 
          GROUP BY id_ARTICLE having count(*) > 1
          




          Cette requête fonctionne sous MySQL mais pas sur d'autre SGBD car je n'ai mis que ID_ARTICLE dans le GROUP BY


          A priori, la requête proposée par minirop est légèrement plus rapide
          • Partager sur Facebook
          • Partager sur Twitter
            23 juin 2011 à 9:27:37

            Je te remercie, je teste dans l'heure et je classe résolu si ça fonctionne ^^

            Celle de minirop fonctionne très bien :)

            Pour les temps, celle de minirop s'exécute en 0.0008 sec et la tienne en 0.0105 sec

            Elle est donc en effet plus rapide :p Merci d'avoir précisé !

            Bonne journée :)
            • Partager sur Facebook
            • Partager sur Twitter

            [MySQL][PDO] Effectuer une requête sur deux tables.

            × 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