web-dev-qa-db-fra.com

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

J'ai 4 tables différentes que je veux 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

En commençant par la table A, je comprends comment joindre des tables a et c en utilisant b, puisque b a les clés primaires pour ces tables. Je veux aussi pouvoir rejoindre la table TableD sur la TableA. Ci-dessous, ma déclaration SQL qui joint 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 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())) 
135
Sun

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.

Remarque: vous remarquerez que j'ai supprimé bon nombre de vos parenthèses, car elles ne sont vraiment pas nécessaires dans la plupart des cas où vous les avez eues, et ne font qu'ajouter à la confusion lorsque vous essayez de lire le code. Une imbrication correcte est le meilleur moyen de rendre votre code lisible et séparé.

291
Justin Pihony
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()
24
Nemoden

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

4
Chriseyre2000

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;
2
Manu R S