2013-11-01 94 views
1

回到我的MySQL數據庫,有兩個表,一個有兩個鍵值,而第二個從兩個表中選擇並始終從一個

第一表總是有數據與之相關的1到N,但與之相關的第二張表可能沒有。 我需要總是返回第一個數據,獨立如果第二個表中沒有。

繼承人我查詢:

select a.*, b.* FROM disp_ofer a, ofer_detl b 
WHERE 
a.esta_cod = 'Lelis' 
AND 
a.disp_ofer_data = '2013-10-30 16:07:20' 
AND 
b.disp_ofer_data = a.disp_ofer_data 
AND 
b.esta_cod = a.esta_cod 
+2

使用'留下join'。另外,我假設用_「有兩個關鍵值」_你真的意味着_一個複合主鍵_對嗎? – geomagas

+0

@darkman您不應該根據聲望或投票選擇答案。我的答案格式更好,內容更多。我可以問你爲什麼選擇另一個嗎? – plalx

回答

2

使用join語法...聯接表。

在你的情況下,一個左加入。

select a.*, b.* FROM disp_ofer a 
Left join ofer_detl b 
    on b.disp_ofer_data = a.disp_ofer_data and b.esta_cod = a.esta_cod 
WHERE 
a.esta_cod = 'Lelis' 
AND 
a.disp_ofer_data = '2013-10-30 16:07:20' 
0
select a.*, b.* 
FROM disp_ofer a 
LEFT OUTER JOIN ofer_detl b ON (b.esta_cod = a.esta_cod AND b.disp_ofer_data = a.disp_ofer_data) 
WHERE 
a.esta_cod = 'Lelis' 
AND 
a.disp_ofer_data = '2013-10-30 16:07:20' 
+0

'OUTER'關鍵字不是必需的。 – plalx

+0

是的,但給理解 – LINQ2Vodka

1

始終使用JOIN語法,而不是在FROM聲明列出多個表。這被認爲是一種更好的做法。

A LEFT JOIN可以讓你實現這個目標。 NATURAL關鍵字將執行,然後自動連接兩個表中存在的所有列。

SELECT a.*, b.* 
FROM disp_ofer a 
NATURAL LEFT JOIN ofer_detl 
WHERE a.esta_cod = 'Lelis' AND a.disp_ofer_data = '2013-10-30 16:07:20' 
0

我建議你不要只是從你的代碼的任何答案中提出一個查詢,並忘記這個問題,但要閱讀和理解它。連接非常容易理解,它們是每個Web開發人員都應該知道的基礎知識的一部分。 This article會幫助你,我希望。

下面進入我的版本的查詢:

SELECT do.*, od.* 
FROM disp_ofer do 
LEFT JOIN ofer_detl od USING(ofer_data, esta_cod) 
WHERE 
    do.esta_cod = 'Lelis' 
    AND do.disp_ofer_data = '2013-10-30 16:07:20'