问题的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
作为测试,但它不显示我想要的结果。
感谢
您没有表结构来支持这样做(或者,如果你这样做,你没有在表中列出)。你需要做什么你是后三个表什么:
- 国家
- 结果
- 国家的结果
(仅供参考,SQL表通常在奇异形式命名,即Country
,Result
,CountryResult
等)
你列出的仅仅是相当于Country
和CountryResult
表。
如果你有第三个表,你会那么做这样的事情:
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
所以我应该创建与统计类型列表的表格? – Jon 2011-03-02 14:54:44
我错过了关于MySQL的奇怪事情吗?如果你想要一个笛卡尔产品,你通常不会做一个CROSS JOIN而不必做一些奇怪的事情,比如“1 = 1”? – 2011-03-02 14:56:57
@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
-1。这不会做OP所要求的;这将只列出没有有效的“国家”的结果。它不会列出不存在的结果。 – 2011-03-02 14:47:49
它以不同的顺序给出相同的结果。 – 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
是在另一个或多个表中,我们可以利用这里所列举的统计/类型? – 2011-03-02 14:45:03
你有一个包含结果类型的表和另一个包含结果值的表吗? – linepogl 2011-03-02 14:45:46
在我们可以利用的另一个表中存在统计信息/类型吗? 不,这是唯一的表 – Jon 2011-03-02 14:49:35