问题的LEFT在MySQL

问题描述:

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

您没有表结构来支持这样做(或者,如果你这样做,你没有在表中列出)。你需要做什么你是后三个表什么:

  • 国家
  • 结果
  • 国家的结果

(仅供参考,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

使用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

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