2011-09-22 104 views
5

我有一个简单的语言/模板标识表:MySQL左加入子选择

语言|模板

连接,T1
恩,T1
AU,T2
GE,T3
恩,T1
GE,T2
GE,T3

模板始终为T1,T2,或t3。总共有3种语言:en,au,ge。

有很多的表的详细信息,我只是展示了什么是有关这个问题,我将使用的图形数据,并因此需要它采用该格式返回:

连接,T1,3
烯,T2,0
烯,T3,0
AU,T1,0
AU,T2,1个
AU,T3,0
GE,T1,0
GE,T2,1
ge,t3,2

但是,这可以计算每种语言中存在的很多模板事件。但是,如果表中没有该特定语言的模板标识符,则我遇到的问题是返回零计数。

我在想,它会需要某种左连接子选择模板ID以确保3模板ID是为每种语言返回?

+0

为什么你不写SQL,所以我们可以看到哪里(或者如果)有错误? – Martin

+0

是否还有模板表和/或语言表?或者这个表是这个数据的唯一来源吗? –

+0

选择a.template,计数(a.template)作为计数,a.language,从表a 左连接(从表中选择不同(模板))在a.template = b.template上 group by a.template ,a.language order by a.language,a.template – StuR

回答

5

有可能是这样做的更好的方法,我还没有在MySQL的测试,但在SQL Server 2005中的以下工作:

Select a.language, b.template, count (c.template) as combo_count 
from 
(select distinct language from tablename) as a 
inner join (select distinct template from tablename) as b on 1 < 2 /* this could be cross join, same thing. */ 
left outer join tablename c on c.language = a.language and c.template = b.template 
group by a.language, b.template 
order by 1, 2 

下面是结果与你的样本数据:

au t1 0 
au t2 1 
au t3 0 
en t1 3 
en t2 0 
en t3 0 
ge t1 0 
ge t2 1 
ge t3 2 
+0

完美,正是我所追求的,并且在MySQL中运行良好。谢谢你的帮助。 – StuR

0
Select a.language, a.template, Count(*) count 
    From (Select Distinct language, template From table) a 
    Left Join table b 
     On b.language = a.language 
      And b.template = b.template 
    Group By a.language, a.template 
+0

已经给了这个尝试,虽然我仍然得到相同的,因为我会在我上面的评论中使用查询(没有零值)。此外,为什么先组合语言不应该是a.template,a.language? – StuR

0

您需要的是两个表,其中列出了语言和模板的可能值。

CREATE TABLE language (...) AS SELECT DISTINCT language FROM your_table; 
CREATE TABLE template (...) AS SELECT DISTINCT template FROM your_table; 

然后,你可以做这样的事情:

SELECT l.language, t.template, SUM(CASE WHEN yours.language IS NULL THEN 0 ELSE 1 END) count 
FROM language l CROSS JOIN template t 
LEFT OUTER JOIN your_table yours ON l.language = yours.language AND t.template = yours.template 
GROUP BY l.language, t.template; 
+1

使用两个表格将会和下面的一样:“FROM(从表格中选择distinct(语言))l CROSS JOIN(从table中选择distinct(模板))t”不是吗?尽管我得到了与下面的答案相同的结果,但我已经给出了这一点。 – StuR