web-dev-qa-db-ja.com

IDを使用して複数のSQLテーブルを結合する方法を教えてください。

参加したい4つの異なるテーブルがあります。表は、以下のように列で構成されています。

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

Bはそれらのテーブルの主キーを持っているので、テーブルAから始めて、bを使ってテーブルaとcをジョインする方法を理解します。 TableA上のTable 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())) 
135
Sun

あなたはもっとこのようなものが欲しいです:

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を含んでいません。あなたがしなければならないのはあなたが前にしたのと全く同じように別の結合を実行することだけです。

注意:括弧の多くは削除したことに気付くでしょう。括弧は実際にはほとんど必要ないので不要で、コードを読み込もうとするときに混乱を招くだけです。適切なネスティングは、コードを読みやすく、分離するための最良の方法です。

288
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

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

4
Chriseyre2000

単純な内部結合ビューのコード....

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