2011-10-19 60 views
1

我遇到了這種情況很多,我將有一個查詢,將有一個表所需的聯接條件可能沒有條目,因此要求我使用左連接。當它與多於1個連接一起使用時,我無法圍繞語法進行打包。MySQL LEFT RIGHT JOIN語法流暢

我得:

SELECT A.*, B.*, C.* 
FROM A, B, C 
WHERE A.id = C.id 
AND C.aid = A.id 
AND B.cid = C.id 

走來d用的是空的可能性,我必須重寫查詢和遇到的問題。

我該如何簡單地將D加入這些表中的任何一個?

+0

我看到有人在那裏發現的方式我jQuery的不能正常工作的問題hahaha –

回答

1

我的建議是永遠不要在FROM子句中指定多個列。

爲了清楚起見,最好是始終:

  • 使用JOIN子句
  • 使用別名
  • 指定上等號的左側連接的表列

例子:

SELECT a.*, b.*, c.* 
FROM ATable a 
INNER JOIN BTable b 
    ON b.id = a.id 
INNER JOIN CTable c 
    ON c.id = a.id 
WHERE a.someColumn = 'something' 

不知道MySQL的,但在其他一些SQL口味,你可以使用相同的更新和刪除,如:

DELETE FROM a 
FROM ATable a 
INNER JOIN BTable b 
    ON b.id = a.id 
INNER JOIN CTable c 
    ON c.id = a.id 
WHERE a.someColumn = 'something' 

UPDATE a 
SET something = newValue 
FROM ATable a 
INNER JOIN BTable b 
    ON b.id = a.id 
INNER JOIN CTable c 
    ON c.id = a.id 
WHERE a.someColumn = 'something' 
-1

希望這將有助於

SELECT 
A.*, B.*, C.* 
FROM A 
inner join C on(A.id = C.id) 
inner join B on(B.cid = C.id) 
5

你好得多明確指定所有的連接。這應該讓事情更清楚。

SELECT A.*, B.*, C.*, D.* 
    FROM A 
     INNER JOIN C 
      ON C.aid = A.id 
     INNER JOIN B 
      ON B.cid = C.id 
     LEFT JOIN D 
      ON C.did = d.id 
+1

+1打我41秒的相同答案:) –

1

下面的語法應該可以幫到你。基本的前提是無論列出哪個表,LEFT都是必需的..右側的表(或別名)是可選的。我知道你不太明白,你的語法樣本顯示(不是要批評),因爲你正在從A - > C和C加入另一個領域。如果這是在兩個領域都處於「C」表都指向A,你會重新加入到A作爲第二別名的情況下...

select 
     Want.*, 
     Maybe.*, 
     SecondA.*, 
     B.* 
    From 
     A as Want 
     LEFT JOIN C as Maybe 
      on Want.ID = Maybe.ID 

      JOIN A as SecondA 
       on Maybe.AID = SecondA.ID 
      JOIN B 
       on Maybe.ID = B.cID 

所以,這個查詢說明我想表A中的所有內容(別名Want - 列表中的左側/第一個表)無論表C(別名也許)中的ID鍵匹配的匹配項如何。

注意下一個連接從「C」回落到「A」和表B的第二個實例。我把那些只作爲連接...因此,「Maybe」別名和第二個連接「A」和「B」的實例是JOIN(必需)。

希望這可以更好地說明它的工作原理。

現在,爲您的真實查詢。如果你可以描述你正在尋找什麼,以及你的示例表結構/結果展望,列表可以提供更明確的解決方案來滿足你的需求。