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 :

Requete difficile multi table avec multi champ


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 42
    Par défaut Requete difficile multi table avec multi champ
    Bonjour,
    Tout d'abord je vous montre les tables et ensuite je vous explique un peu le contexte ainsi que ma question.

    Voici ma table PLAT


    Cette table contient toute sorte de plat comme des entrées (salade,tomate,concombre) mais aussi des desserts ou des plats de résistance.

    Voici ma table MENU



    Cette table contient la composition d'un menu complet ce qui veut dire une entré, un plat, un dessert cependant pour des raisons de stockage je souhaite enregistrer que des id de plat dans cette table donc jusque la tous va bien .

    Voici le résultat affiché



    Voila ma question :
    Comment puis je faire pour remplacer l'affichage des id par le nom de mes plats?


    Ah oui j'allais oublié voici une image de mes clés primaires et étrangères.




    Voila cela fait une semaine que je recherche la solution mais sans sucés car effectivement j'arrive bien à faire une jointure pour un champ mais pas pour tous .

    Merci d'avance à tous et bonne journée !!

    Cordialement
    J.LEGRAND

  2. #2
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Bonjour, un truc vite fait pour donner une idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT mes_colonnes
    FROM MENU menu
    INNER JOIN PLAT entree ON entree.id_plat = menu.id_entree
    INNER JOIN PLAT resistance ON resistance.id_plat = menu.id_platresistance
    INNER JOIN PLAT desser ON desser.id_plat = menu.id_dessert
    Il suffit de récupérer les noms des plats dans le select et ça devrait gagner !
    @+

  3. #3
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 42
    Par défaut
    Re,
    Tout d'abbord merci pour ta réponse j'ai essayé ta méthode cependant elle me retourne beaucoup trop de résultat et cela est irrécupérable en PHP car elle me fait des doublons de champ.

    J'apporte un renseignement en gros il faudrait que j'execute ces requetes la pour l'affichage de chacune de mes ligne de ma table menu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT p.nom_plat FROM plat p, menu m WHERE m.entre1_menu = p.id_plat;
    SELECT p.nom_plat FROM plat p, menu m WHERE m.plat1_menu = p.id_plat;
    SELECT p.nom_plat FROM plat p, menu m WHERE m.dessert1_menu = p.id_plat;
    SELECT p.nom_plat FROM plat p, menu m WHERE m.prix1_menu = p.id_plat;
    Ce qui rendrait mon script vraiment trop long !!

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

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

    Tout d'abbord merci pour ta réponse j'ai essayé ta méthode cependant elle me retourne beaucoup trop de résultat et cela est irrécupérable en PHP car elle me fait des doublons de champ.
    Postez la requête que vous avez essayé

  5. #5
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 42
    Par défaut
    Voici la requête modifier pour fonctionné avec mes tables et les champs correspondant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *
    FROM MENU menu
    INNER JOIN PLAT entree ON entree.id_plat = menu.entre1_menu
    INNER JOIN PLAT entree2 ON entree.id_plat = menu.entre2_menu
    INNER JOIN PLAT resistance ON resistance.id_plat = menu.plat1_menu
    INNER JOIN PLAT resistance2 ON resistance.id_plat = menu.plat2_menu
    INNER JOIN PLAT desser ON desser.id_plat = menu.dessert1_menu
    INNER JOIN PLAT desser2 ON desser.id_plat = menu.dessert2_menu
    INNER JOIN PLAT prix ON desser.id_plat = menu.prix1_menu
    INNER JOIN PLAT prix2 ON desser.id_plat = menu.prix2_menu

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    La requête n'est pas ok.

    Vous avez des problèmes avec l'utilisation de vos alias => ca fait des jointures cartésiennes dans tous les sens.

  7. #7
    Invité de passage
    Inscrit en
    Juin 2012
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 1
    Par défaut Requete difficile multi table avec multi champ
    Bonjour,

    j'ai le même soucis et je me demande si la solution ne serait pas de faire des unions de requête ?
    Qu'en pensez-vous ?

  8. #8
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    La requête postée par jujoluca devrait faire ce que vous souhaitez en tenant compte de la remarque de Punkoff...

  9. #9
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2011
    Messages : 42
    Par défaut
    Bonjour à tous,

    Je viens vous faire un petit compte rendu, par manque de temps j'ai modifié ma structure de table en enregistrant plus les id mais le nom directement ce qui remplis considérablement mon espace alloué en BDD, cependant après quelque test on m'as conseillé cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT p.nom_plat AS entre1, p2.nom_plat AS entre2 FROM menu m, plat p, plat p2 WHERE p.id_plat = m.entre1_menu AND p2.id_plat = m.entre2_menu
    je ne sais pas ce quelle vaut il faut que je l'essaye est je le ferait après le 19 juin car je n'aime pas resté sans réponse à un problème.

    Si quelqu'un arrive a éxecuter une requete multi table sur multi champ, merci de me le dire

    Bonne journée

  10. #10
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    le but des jointures est de rapatrier ou restreindre un jeu de données mettant en jeu plusieurs tables sur un ou des critères...

    vu ce que tu as fait comme requête, tu n'y as pas compris grand chose...

    ton modèle de données pour tes table n'est pas forcément bon...

    tu utilises du varchar et du timestamp pour les dates et aussi pour état qui devrait être du bool (ou boolean)
    tu n'utilises pas un type numérique pour les prix

    genre pour tes modèles de tables:
    Code sql : 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
    create table menus
    (
    	`id`						int not null auto_increment,
    	`date creation`		date default now(),
    	`date modification`	date,
    	`etat`					bool default true,
    	`nom`						varchar(64) not null,
    	constraint pk_menus primary key(id)
    )engine=myisam auto_increment=1;
     
    create table `types plats`
    (
    	`id`	int not null auto_increment,
    	`nom`	varchar(64) not null,
    	constraint pk_types_plats primary key(id)
    )engine=myisam auto_increment=1;
     
    create table `periodes`
    (
    	`id`	int not null auto_increment,
    	`nom`	varchar(64) not null,
    	constraint pk_periodes primary key(id)
    )engine=myisam auto_increment=1;
     
    create table plats
    (
    	`id`						int not null auto_increment,
    	`id type`				int not null,
    	`id periode`			int not null,
    	`prix`					decimal(5,2) not null,
    	`date creation`		date default now(),
    	`date modification`	date,
    	`nom`						varchar(64) not null,
    	constraint pk_plats primary key(id),
    	key k_plats_types(`id type`),
    	key k_plats_periodes(`id periode`)
    )engine=myisam auto_increment=1;
     
    create table `prix menu`
    (
    	`id`				int not null auto_increment,
    	`id menu`		int not null,
    	`valeur`			decimal(5,2) not null,
    	`designation`	varchar(64) not null,
    	constraint pk_prix primary key(id),
    	key k_prix_menus(`id menu`)
    )engine=myisam auto_increment=1;
     
    create table contenu
    (
    	`id`			int not null auto_increment,
    	`id menu`	int not null,
    	`id plat`	int not null,
    	constraint pk_contenu primary key(id),
    	key k_contenu_menus(`id menu`),
    	key k_contenu_plats(`id menu`)
    )engine=myisam auto_increment=1;

    ce qui est répétitif est dégagé dans des tables secondaires, on gagne en performances et tailles de tables...

    les tables de liaisons contenu et `prix menus` te permette de la souplesse sur le nombre d'éléments associés...

    innodb est inutile ici donc avec myisam, pas de clé étrangère mais tu peux compenser par de simples index, sur les colonnes théoriquement clé étrangères, pour garder les performances...

    prenons un exemple de remplissage pour `types plats`
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into `types plats`(nom)values
    ('Entrée'),
    ('Plat principal'),
    ('Dessert');

    tu veux lister les entrées(id=3 vu l'insert ci-dessus) du plat dont l'id est 3:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select p.nom as `nom`,p.prix as `prix`
    from plats p
    inner join contenu c on c.`id menu`=3 and c.`id plat`=p.id
    where p.`id type`=3;

Discussions similaires

  1. [MySQL] Requete SELECT multi-tables avec un ORDER BY
    Par Twenty4 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/12/2010, 02h36
  2. Requete multi tables avec champs vides
    Par zezette31 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 02/04/2008, 17h57
  3. Requete multi table avec LIMIT et ORDER BY
    Par yobogs dans le forum Requêtes
    Réponses: 1
    Dernier message: 31/10/2006, 17h29
  4. [MySQL] Requete sur 2 tables avec champs commun
    Par marcd dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/04/2006, 16h14
  5. Sélection multi table avec condition
    Par iuz dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/05/2004, 15h04

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