144 votes

Comment puis-je joindre plusieurs tables SQL en utilisant les ID ?

J'ai 4 tables différentes que je veux joindre. Les tables sont structurées avec les colonnes suivantes :

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

En partant de la table A, je comprends comment JOINDRE les tables a et c en utilisant b, puisque b possède les clés primaires de ces tables. Je veux pouvoir joindre la table TableD à la TableA également. Voici mon instruction SQL qui joint d'abord les tables A et B, puis les joint à C :

SELECT TableA.*, TableB.*, TableC.* FROM (TableB INNER JOIN TableA
ON TableB.aID= TableA.aID)
INNER JOIN TableC ON(TableB.cID= Tablec.cID)
WHERE (DATE(TableC.date)=date(now())) 

Lorsque je tente d'ajouter une autre jointure, pour inclure D, je reçois une erreur indiquant que 'TableD' est inconnu :

 SELECT TableA.*, TableB.*, TableC.*, TableD.* FROM (TableB INNER JOIN TableA
    ON TableB.aID= TableA.aID)
    INNER JOIN TableC ON(TableB.cID= Tablec.cID)
    INNER JOIN TableA ta ON(ta.dID= TableD.dID)
    WHERE (DATE(TableC.date)=date(now()))

306voto

Justin Pihony Points 21088

Vous voulez quelque chose de plus comme ça :

SELECT TableA.*, TableB.*, TableC.*, TableD.*
FROM TableA
    JOIN TableB
        ON TableB.aID = TableA.aID
    JOIN TableC
        ON TableC.cID = TableB.cID
    JOIN TableD
        ON TableD.dID = TableA.dID
WHERE DATE(TableC.date)=date(now()) 

Dans votre exemple, vous n'incluez pas réellement TableD . Tout ce que vous avez à faire est d'effectuer une autre jointure comme vous l'avez fait auparavant.

Une note : vous remarquerez que j'ai supprimé un grand nombre de vos parenthèses, car elles ne sont vraiment pas nécessaires dans la plupart des cas où vous les aviez, et ne font qu'ajouter de la confusion lorsque vous essayez de lire le code. Une imbrication correcte est la meilleure façon de rendre votre code lisible et séparé.

2 votes

Select tableN.* ne va-t-il pas dupliquer tous les ID de clé primaire correspondants dans les étiquettes de colonne ? (la question ne précise pas le résultat souhaité, mais je pense qu'en général, vous ne voudriez pas faire cela).

6 votes

Puis-je demander pourquoi le JOINTableC est ON TableC.cID = TableB.cID et non TableC.cID = TableA.cID . Je suppose que nous rejoignons TableA aux 3 autres tables.

25voto

Nemoden Points 4520
SELECT 
    a.nameA, /* TableA.nameA */
    d.nameD /* TableD.nameD */
FROM TableA a 
    INNER JOIN TableB b on b.aID = a.aID 
    INNER JOIN TableC c on c.cID = b.cID 
    INNER JOIN TableD d on d.dID = a.dID 
WHERE DATE(c.`date`) = CURDATE()

4voto

Chriseyre2000 Points 1671

Vous n'avez pas joint la TableD, mais simplement sélectionné le CHAMP de la TableD ( dID ) de l'une des tables.

2voto

Manu R S Points 51

Simple INNER JOIN VIEW code....

CREATE VIEW room_view
AS SELECT a.*,b.*
FROM j4_booking a INNER JOIN j4_scheduling b
on a.room_id = b.room_id;

0 votes

Ne pas utiliser la structure de table de l'OP ? !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X