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

Requêtes MySQL Discussion :

SELECT, JOINS, WHERE


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Par défaut SELECT, JOINS, WHERE
    Bonsoir,

    J'aimerais sélection des données dans 3 tables différentes à l'aide d'un Select et quelques joins, mais j'ai quelques souci Je n'arrive qu'à faire un cross operateur.

    Mon paramètre de ma requête est l'id du lunch, en retour je devrais recevoir les desserts, les starters et les maincourses d'un lunch spécifique.

    En gros j'aimerais avoir une requête qui me renvoit les troix colones au lieu d'avoir 3 requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name FROM starters, lunch WHERE lunch.id = 1;
    SELECT name FROM maincourses, lunch WHERE lunch.id =1;
    SELECT name FROM desserts, lunch WHERE lunch.id = 1;

    Par exemple pour id 1 :

    desserts starters maincourses
    dessert1 start1 main1
    dessert2 start2 main2
    dessert3 start3 main3
    dessert4 start4 main4
    dessert5 start5 main5


    Voici mes tables :

    lunch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE IF NOT EXISTS `lunch` (
      `id` smallint(5) unsigned NOT NULL auto_increment,
      `from` varchar(20) NOT NULL,
      `until` varchar(20) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
    starters

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE IF NOT EXISTS `starters` (
      `id` smallint(5) unsigned NOT NULL,
      `name` varchar(200) NOT NULL,
      `flag` enum('lunch','menu') NOT NULL default 'lunch',
      KEY `id` (`id`,`name`,`flag`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
    maincourses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE maincourses SELECT LIKE starters
    desserts

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE desserts SELECT LIKE starters
    Et quelques données :

    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
     
     
     
    INSERT INTO `lunch` (`id`, `from`, `until`) VALUES
    (1, '06/01/2009', '13/01/2009');
     
    INSERT INTO `desserts` (`id`, `name`, `flag`) VALUES
    (1, 'dessert1', 'lunch'),
    (1, 'dessert2', 'lunch'),
    (1, 'dessert3', 'lunch'),
    (1, 'dessert4', 'lunch'),
    (1, 'dessert5', 'lunch');
     
     
    INSERT INTO `maincourses` (`id`, `name`, `flag`) VALUES
    (1, 'main1', 'lunch'),
    (1, 'main2', 'lunch'),
    (1, 'main3', 'lunch'),
    (1, 'main4', 'lunch'),
    (1, 'main5', 'lunch');
     
    INSERT INTO `starters` (`id`, `name`, `flag`) VALUES
    (1, 'start1', 'lunch'),
    (1, 'start2', 'lunch'),
    (1, 'start3', 'lunch'),
    (1, 'start4', 'lunch'),
    (1, 'start5', 'lunch');
    Merci beaucoup d'avance !

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Quelle raison logique y a-t-il de mettre dessert1 en face de start1 ? Si c'est juste parce qu'ils se terminent par le même caractère, c'est un peu léger...

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Par défaut
    L'ordre n'a pas d'importance !
    Je voulais juste savoir comment on fait pour retourner les staters, maincourses et desserts d'un lunch en sachant que l'id du lunch se trouve dans chaque éntrée de starters, maincourses, desserts. Je peux le réaliser en trois requête séparées, mais il faut que j'ai le tout en une seule requête !
    Merci pour votre aide

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    S'il n'y a pas de lien logique, on sort un peu du cadre du SQL... on pourrait en créer un, en ajoutant une ID numérique sur chaque table et en faisant des FULL OUTER JOIN entre chaque table, mais ça n'a pas grand intérêt. Si c'est juste de la cosmétique, autant le faire en PHP !

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Par défaut
    Justemment j'ai divisé en multi tables, pensant que ca allait ajouter un lien logique.
    Je m'explique :

    Un menu est composé de 5entrées, 5plats et 5desserts.

    Lorsque je veux créer un menu, un ID se crée automatiquement dans la table du menu qui contient également un champ du - au.

    Lorsque je rajoute les entrées, plats et desserts je pensais qu'il était meilleur "design" (normalisation), d'avoir une table séparée avec l'ID du menu auquel les entrées, plats, desserts appartient.

    Comme cela lorsqu'il fallait récuper le tout, on pouvait faire cela facilement grace à l'ID du menu stocké dans chaque table. Visible je me suis trompé.
    Que me suggériez vous pour avoir un bon design, qui est normalisé ?

    Merci beaucoup pour votre aide

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Si tu veux juste récupérer pour un id de type de repas donné, toutes ses entrées, tous ses plats principaux et tous ses desserts, il te suffit de mettre les quatre tables en jointure sur la clef étrangère id et le flag 'lunch' et de faire un GROUP_CONCAT pour chacun des trois items avec un GROUP BY sur lunch.id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT l.id,
    GROUP_CONCAT(s.name) entrées,
    GROUP_CONCAT(m.name) principaux,
    GROUP_CONCAT(d.name) les_desserts 
    FROM lunch l
    INNER JOIN starters s ON s.id=l.id AND s.flag='lunch'
    INNER JOIN maincourses m ON m.id=l.id AND m.flag='lunch'
    INNER JOIN desserts d ON d.id=l.id AND d.flag='lunch'
    GROUP BY l.id
    ORDER BY l.id
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

Discussions similaires

  1. [COUNT] select ... from ... where count !
    Par tmcgrady dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/11/2007, 17h29
  2. probleme avec SELECT..FROM..WHERE
    Par VBBBA dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 08/09/2006, 15h58
  3. Pb de syntaxe sql : Sélection SELECT FROM WHERE vide
    Par oceanediana dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 31/07/2006, 15h54
  4. [hibernate][spring]requete select from where IN
    Par whilecoyote dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/04/2006, 09h06
  5. [Performances] Ordre d'éxecution de JOIN / WHERE
    Par brice01 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/02/2006, 21h40

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