2012-10-24 155 views
1

我想要加入一個具有布爾列的表,並且在我的結果中,我試圖從連接中獲取兩列,其中布爾值爲0,在哪裏它是1.MySQL GROUP BY上的SELECT If語句

由於有一對多的關係,我需要做一個GROUP BY。

以下查詢返回正確的非GROUP BY結果。

對於每個配置文件ID,至少有一行用於流派和影響力。

SELECT p.profileID, IF(gpro.isInfluence =0, g.genreName, NULL) AS genre, IF(gpro.isInfluence =1, g.genreName, NULL) AS influence, g.genreName 
FROM profiles p 
LEFT JOIN genre_profiles gpro ON gpro.profileID = p.profileID 
LEFT JOIN genres g ON g.genreID = gpro.genreID 
WHERE g.genreName IS NOT NULL 

但是,當我做相應的GROUP BY/GROUP_CONCAT輸出沒有意義。

SELECT p.profileID, IF(gpro.isInfluence =0, GROUP_CONCAT(g.genreName) , NULL) AS genre, IF(gpro.isInfluence =1, GROUP_CONCAT(g.genreName) , NULL) AS influence, g.genreName 
FROM profiles p 
LEFT OUTER JOIN genre_profiles gpro ON gpro.profileID = p.profileID 
LEFT OUTER JOIN genres g ON g.genreID = gpro.genreID 
WHERE g.genreName IS NOT NULL 
GROUP BY p.profileID 

上述基團的所有的行g.genreName在任一列的,而不是將它們被分裂基於所述gpro.isInfluence值。結果落在我認爲對應於分組的第一個結果的列。

1000001052 Latin American,Rock,Hip Hop NULL 
1000001637 NULL Electronic,Easy listening,Asian,popgun 
1000001666 NULL Electronic,Bacon,Emo,Modern folk,Hip Hop,R... 

我不明白的是爲什麼流派值被分組在一起,而不是像第一個查詢那樣在各自的列中。

+0

你會很好地提供你的表結構,如果可能的話,SQLFiddle(http://sqlfiddle.com/) – LSerni

+1

也許你用錯誤的方式使用了group_concat –

+0

我會做幾個小提琴。我忽略了完整的結構,所以它不會太複雜。 – bikedorkseattle

回答

0
SELECT p.profileID, GROUP_CONCAT(IF(gpro.isInfluence =0, g.genreName, NULL)) AS genre, GROUP_CONCAT(IF(gpro.isInfluence =1, g.genreName, NULL)) AS influence, g.genreName 
FROM profiles p 
LEFT OUTER JOIN genre_profiles gpro ON gpro.profileID = p.profileID 
LEFT OUTER JOIN genres g ON g.genreID = gpro.genreID 
WHERE g.genreName IS NOT NULL 
GROUP BY p.profileID 

把GROUP_CONCAT IF語句之外給出正確的輸出,得益於Ertunc幫助我的大腦做出一個支點。