2011-03-02 59 views
0

JOIN我有2個表問題的LEFT在MySQL

countries: 
id, name 

results: 
id, stat, type, country, value, date 

stat可以是任何的10個值的和type之一2. Country是國家對countries表中的id。

特定日期的結果並非所有國家/地區。

如何創建一個LEFT JOIN因此所有國家都列出了EVERY stat - type組合,因此,如果一個國家沒有結果的話,0(或NULL)將顯示。

我試過SELECT * FROM dt_countries c LEFT JOIN results r ON c.id = r.country作爲測試,但它不顯示我想要的結果。

感謝

+0

是在另一個或多個表中,我們可以利用這裏所列舉的統計/類型? – 2011-03-02 14:45:03

+0

你有一個包含結果類型的表和另一個包含結果值的表嗎? – linepogl 2011-03-02 14:45:46

+0

在我們可以利用的另一個表中存在統計信息/類型嗎? 不,這是唯一的表 – Jon 2011-03-02 14:49:35

回答

0

您沒有表結構來支持這樣做(或者,如果你這樣做,你沒有在表中列出)。你需要做什麼你是後三個表什麼:

  • 國家
  • 結果
  • 國家的結果

(僅供參考,SQL表通常在奇異形式命名,即Country,Result,CountryResult等)

你列出的僅僅是相當於CountryCountryResult表。

如果你有第三個表,你會那麼做這樣的事情:

select 
    c.Name as Country, 
    r.Name as Result, 
    cr.Value as Value 

from Country c 

cross join Result r -- We WANT a cartesian product 
left join CountryResult cr on cr.CountryId = c.CountryId and cr.ResultId = r.ResultId 
+0

所以我應該創建與統計類型列表的表格? – Jon 2011-03-02 14:54:44

+0

我錯過了關於MySQL的奇怪事情嗎?如果你想要一個笛卡爾產品,你通常不會做一個CROSS JOIN而不必做一些奇怪的事情,比如「1 = 1」? – 2011-03-02 14:56:57

+1

@Matt:是的,你通常會使用'CROSS JOIN'。出於某種原因,我認爲MySQL不支持它們,但這看起來不準確。我編輯了我的答案;謝謝! – 2011-03-02 15:03:22

0

使用LEFT OUTER JOIN

SELECT * 
FROM results r 
LEFT OUTER JOIN dt_countries c 
    ON c.id = r.country 
+0

-1。這不會做OP所要求的;這將只列出沒有有效的「國家」的結果。它不會列出不存在的結果。 – 2011-03-02 14:47:49

+0

它以不同的順序給出相同的結果。 – Jon 2011-03-02 14:48:43

0
select st.stat, st.type, r.date, c.name, r.value 
from 
(select distinct stat, type from results) st 
cross join dt_countries c 
left outer join results r on 
    c.id = r.country and r.stat = st.stat and r.type = st.type 
order by st.stat, st.type, r.date, c.name