参加したい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()))
あなたはもっとこのようなものが欲しいです:
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
を含んでいません。あなたがしなければならないのはあなたが前にしたのと全く同じように別の結合を実行することだけです。
注意:括弧の多くは削除したことに気付くでしょう。括弧は実際にはほとんど必要ないので不要で、コードを読み込もうとするときに混乱を招くだけです。適切なネスティングは、コードを読みやすく、分離するための最良の方法です。
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()
TableDに参加していません。いずれかのテーブルからTableD FIELD(dID
)を選択しただけです。
単純な内部結合ビューのコード....
CREATE VIEW room_view
AS SELECT a.*,b.*
FROM j4_booking a INNER JOIN j4_scheduling b
on a.room_id = b.room_id;