2011-09-22 106 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