IDを使用して複数のSQLテーブルを結合するにはどうすればよいですか?


141

結合したい4つの異なるテーブルがあります。テーブルは、次のような列で構成されています。

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

テーブルAから始めて、bにはテーブルの主キーがあるため、bを使用してテーブルaとcを結合する方法を理解しました。TableAのTableDも結合できるようにしたい。以下は、最初にテーブルAとBを結合し、次にそれをCに結合するSQLステートメントです。

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())) 

Dを含めるために別の結合を追加しようとすると、「TableD」が不明であるというエラーが表示されます。

 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())) 

回答:


302

あなたはこのようなものをもっと欲しい:

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()) 

あなたの例では、実際にはを含めていませんTableD。あなたがしなければならないのは、あなたが以前にしたのと同じように別の参加を実行することだけです。

注:かっこの多くを削除したことに気づくでしょう。ほとんどの場合、かっこは実際には必要ないため、コードを読み取ろうとしたときに混乱を招くだけです。適切なネストは、コードを読みやすく分離するための最良の方法です。


2
tableN。*を選択しませんか?列ラベルの一致する主キーIDをすべて複製しますか?(質問ではどの出力が望ましいかを指定していませんが、通常はこれを実行したくないと思います)
Heather Stark

6
なぜ私は頼むかもしれないJOINTableCON TableC.cID = TableB.cIDはありませんTableC.cID = TableA.cIDTableA他の3つのテーブルに結合することを想定しました。
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()

4

TableDに参加していませんdID。テーブルの1つからTableD FIELD()を選択しただけです。


2

単純な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;

OPのテーブル構造を使用しない?!
Istiaque Ahmed 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.