Comment puis-je joindre plusieurs tables SQL à l'aide des ID?

141

J'ai 4 tables différentes que je souhaite rejoindre. Les tableaux sont structurés avec des colonnes comme suit:

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

À partir de la table A, je comprends comment JOIN des tables a et c en utilisant b, puisque b a les clés primaires pour ces tables. Je veux également pouvoir joindre la table TableD sur TableA. Voici mon instruction SQL qui joint d'abord les tables A et B, puis joint cela à 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 j'essaie d'ajouter une autre jointure, pour inclure D, j'obtiens 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())) 
Soleil
la source

Réponses:

303

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é beaucoup 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 appropriée est le meilleur moyen de rendre votre code lisible et séparé.

Justin Pihony
la source
2
ne sélectionnera pas tableN. * dupliquer tous les ID de clé primaire correspondants dans les étiquettes de colonne? (La question ne spécifiait pas la sortie souhaitée, mais en général, vous ne voudriez pas faire cela, je pense)
Heather Stark
6
Puis-je demander pourquoi le JOINTableCest ON TableC.cID = TableB.cIDet non TableC.cID = TableA.cID. J'ai supposé que nous rejoignions TableAles 3 autres tables.
emihir0
25
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()
Nemoden
la source
4

Vous n'avez pas rejoint TableD, vous avez simplement sélectionné le CHAMP TableD ( dID) dans l'une des tables.

Chriseyre2000
la source
2

Code simple INNER JOIN VIEW ....

CREATE VIEW room_view
AS SELECT a.*,b.*
FROM j4_booking a INNER JOIN j4_scheduling b
on a.room_id = b.room_id;
Manu RS
la source
Vous n'utilisez pas la structure de table de l'OP?!
Istiaque Ahmed