2012-03-24 14 views
127

Katılmak istediğim 4 farklı tablom var. aşağıdaki gibi tablolar sütunları ile yapılandırılmıştır: Kimlikler kullanarak birden çok SQL tablosuna nasıl katılabilirim?

TableA - aID | nameA | dID 

TableB - bID | nameB | cID | aID 

TableC - cID | nameC | date 

TableD - dID | nameD 

Tablo A ile başlayarak, ben b o tablolar için birincil anahtarları olduğundan, b kullanarak tablolar ve c JOIN nasıl anlıyoruz. TableA'daki TableD'ye de katılabiliyorum. Ben D içerecek şekilde, başka katılmak eklemek istediğinizde

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

, ben 'masaya' bilinmeyen bir hata alıyorum: Aşağıda ilk tablolar A ve B katılır benim SQL deyimi, daha sonra C o katılır

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

cevap

268

Böyle bir şey daha istiyorum. Tek yapmanız gereken, daha önce yaptığınız gibi başka bir katılım gerçekleştirmektir.

Not: Parantezlerinizin çoğunu kaldırdığımı fark edeceksiniz, çünkü bunların çoğunda gerçekten gerekli olmadıklarından ve yalnızca kodu okumaya çalışırken karışıklık eklediklerinden. Doğru yerleştirme, kodunuzu okunabilir ve ayrıştırmak için en iyi yoldur.

+2

*. TableN seçmek sütun etiketleri eşleşen tüm birincil anahtar kimlikleri yinelenmesine neden olmaz? (soru hangi çıktının istendiğini belirtmedi, ama genellikle bunu yapmak istemezsin). –

+2

"JOINTableC" nin neden "TableC.cID = TableB.cID" olduğunu ve TableC.cID neden olmadığını sorabilirim = TableA.cID'. Tablo 3’e diğer 3 tabloya katıldığımızı varsaydım. – emihir0

4

TABLET'e katılmadınız, tablolardan bir tanesini sadece FIELD TABLEDEDEN seçtiniz.

sizin örnekte
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()) 

, aslında TableD dahil değildir:

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

Basit INNER JOIN GÖRÜNÜM kodu ....

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'nin tablo yapısını kullanmıyor musunuz? –

İlgili konular