2012-03-24 11 views
127

私は、参加したいテーブルが4つあります。次のようにテーブルが列で構成されています IDを使用して複数のSQLテーブルに参加するにはどうすればよいですか?

TableA - aID | nameA | dID 

TableB - bID | nameB | cID | aID 

TableC - cID | nameC | date 

TableD - dID | nameD 

は、表Aから始めて、私はbは、それらのテーブルの主キーを持っているので、Bを使用してテーブルとCを結合する方法を理解しています。 TableAにTableDテーブルを結合することもできます。私はDを含め、他の参加追加しようとすると

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

が、私は「提出」は不明であることをエラーが発生します:以下の最初のテーブルAとBを結合し、私のSQL文がある場合、Cにすることを加入

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

答えて

268

:あなたの例では

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を重複していないのだろうか? (質問はどんな出力が望まれているか指定していませんでしたが、私は思っていませんでした) –

+2

なぜ 'JOINTableC'が' TableC.cID = TableB.cID'で 'TableC.cIDではない' = TableA.cID'。私は、他の3つのテーブルに 'TableA'を結合していると仮定しました。 – emihir0

4

TABLEDに参加していないユーザーは、テーブルの1つからFIELD TABLEDを選択しただけです。あなたはより多くのこのような何かしたい

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

シンプル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; 
+0

OPのテーブル構造を使用していませんか? –

関連する問題