2012-10-24 109 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帮助我的大脑做出一个支点。