Remonter plusieurs niveaux de tables MySql
Fermé
PunkarA
Messages postés
4
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
29 avril 2015
-
1 oct. 2012 à 01:12
PunkarA - 3 oct. 2012 à 13:24
PunkarA - 3 oct. 2012 à 13:24
A voir également:
- Remonter plusieurs niveaux de tables MySql
- Tables des matières word - Guide
- Mysql community server - Télécharger - Bases de données
- Excel liste déroulante en cascade 2 niveaux - Guide
- Dans la présentation à télécharger, déplacez l'image dans le cadre sans en modifier la taille. redressez l'image pour que le niveau de la mer soit à l'horizontale. faites correspondre : la ligne avec le niveau de la mer ; le point avec le sommet de la grande voile. combien d'oiseaux sont dans le cadre ? - Forum Word
- Tables ascii - Guide
3 réponses
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
1 oct. 2012 à 11:00
1 oct. 2012 à 11:00
Bonjour,
Je n'ai pas testé, mais je pense que tu peux faire une requête de ce genre :
SELECT o.*
FROM ouvrages o
INNER JOIN lignes l1 ON l1.id = o.ligne
INNER JOIN devis d1 ON d1.id = l1.devis
INNER JOIN devis d2 ON d2.chantier = d1.chantier
INNER JOIN ligne l2 ON l2.devis = d2.id
WHERE l2.id = 53
À vue d'oeil, tu auras peut-être des doublons à gérer par un DISTINCT.
Xavier
Je n'ai pas testé, mais je pense que tu peux faire une requête de ce genre :
SELECT o.*
FROM ouvrages o
INNER JOIN lignes l1 ON l1.id = o.ligne
INNER JOIN devis d1 ON d1.id = l1.devis
INNER JOIN devis d2 ON d2.chantier = d1.chantier
INNER JOIN ligne l2 ON l2.devis = d2.id
WHERE l2.id = 53
À vue d'oeil, tu auras peut-être des doublons à gérer par un DISTINCT.
Xavier
Super, merci pour ta réponse aussi rapide !
Je me demandais justement s'il était possible de procéder à plusieurs jointures INNER JOIN dans une même requête. Je n'ai jamais trouvé ce cas-là dans mes différentes recherches (toujours une jointure simple, donc pas très intéressante dans mon cas).
Je teste ça et je te tiens au jus ;)
Je connaissais pas DISTINCT, je me documente là-dessus et si tout roule, je balancerai un code de principe pour aider les autres personnes qui seraient susceptibles de rencontrer le même problème.
Merci beaucoup en tout cas !
Je me demandais justement s'il était possible de procéder à plusieurs jointures INNER JOIN dans une même requête. Je n'ai jamais trouvé ce cas-là dans mes différentes recherches (toujours une jointure simple, donc pas très intéressante dans mon cas).
Je teste ça et je te tiens au jus ;)
Je connaissais pas DISTINCT, je me documente là-dessus et si tout roule, je balancerai un code de principe pour aider les autres personnes qui seraient susceptibles de rencontrer le même problème.
Merci beaucoup en tout cas !
Hello !
Finalement, ta requête fonctionne très bien dans le principe, je vais simplement me contenter de compléter les différentes requêtes possibles pour ceux qui, comme moi, ont (eu) un peu de mal avec les jointures sur plus de 2 tables :
- comment obtenir, en une seule requête, toutes les infos relatives à l'ouvrage $ID :
on peut ainsi récupérer :
- le n° de la ligne via $['lig']
- le n° du devis via $['dev']
- le nom du chantier via $['cha']
A noter qu'on aurait pu vouloir récupérer d'autres infos, dans quel cas il faudra les rajouter sur la 1ere ligne de ce code (ex : c.adresse AS adr, c.prix_total AS prix, etc.). Evitez les l.*, d.*, c.*, qui peuvent générer une ambiguïté dans MySql !
L'utilisation de LEFT JOIN au lieu d'INNER JOIN est utile pour récupérer les ouvrages dont le champ 'ligne' ne correspond à rien dans la table 'ligne' (et autres correspondances dans les autres tables) !
C'est très utile car la ligne à laquelle se réfère l'ouvrage a très bien pu être supprimée du devis...
- comment récupérer les ouvrages du chantier "TOUR EIFFEL" ?
- comment récupérer les ouvrages du devis "D2012-00128/A" ?
- comment récupérer tous les devis des chantiers comprenant des "parpaings" ?
En espérant en avoir aidé quelques uns ;)
Merci encore à Xavier (Reivax962) pour son aide précieuse !
Finalement, ta requête fonctionne très bien dans le principe, je vais simplement me contenter de compléter les différentes requêtes possibles pour ceux qui, comme moi, ont (eu) un peu de mal avec les jointures sur plus de 2 tables :
- comment obtenir, en une seule requête, toutes les infos relatives à l'ouvrage $ID :
SELECT o.*, l.nb AS lig, d.nb AS dev, c.name AS cha FROM ouvrages AS o LEFT JOIN ligne AS l ON l.ID=o.ligne LEFT JOIN devis AS d ON d.ID=l.devis LEFT JOIN chantiers AS c ON c.ID=d.chantier WHERE o.ID=$ID
on peut ainsi récupérer :
- le n° de la ligne via $['lig']
- le n° du devis via $['dev']
- le nom du chantier via $['cha']
A noter qu'on aurait pu vouloir récupérer d'autres infos, dans quel cas il faudra les rajouter sur la 1ere ligne de ce code (ex : c.adresse AS adr, c.prix_total AS prix, etc.). Evitez les l.*, d.*, c.*, qui peuvent générer une ambiguïté dans MySql !
L'utilisation de LEFT JOIN au lieu d'INNER JOIN est utile pour récupérer les ouvrages dont le champ 'ligne' ne correspond à rien dans la table 'ligne' (et autres correspondances dans les autres tables) !
C'est très utile car la ligne à laquelle se réfère l'ouvrage a très bien pu être supprimée du devis...
- comment récupérer les ouvrages du chantier "TOUR EIFFEL" ?
SELECT * FROM ouvrages AS o INNER JOIN ligne AS l ON o.ligne=l.ID INNER JOIN devis AS d ON l.devis=d.ID INNER JOIN chantiers AS c ON d.chantier=c.ID WHERE c.name="TOUR EIFFEL"
- comment récupérer les ouvrages du devis "D2012-00128/A" ?
SELECT * FROM ouvrages AS o INNER JOIN ligne AS l ON o.ligne=l.ID INNER JOIN devis AS d ON l.devis=d.ID WHERE d.nb="D2012-00128/A"
- comment récupérer tous les devis des chantiers comprenant des "parpaings" ?
SELECT * FROM devis AS d1 INNER JOIN chantiers AS c1 ON d1.chantier=c1.ID INNER JOIN devis AS d2 ON d2.chantier=c1.ID INNER JOIN ligne AS l2 ON l2.devis=d2.ID WHERE l2.description LIKE "%parpaing%"
En espérant en avoir aidé quelques uns ;)
Merci encore à Xavier (Reivax962) pour son aide précieuse !