SELECT GROUP上的MySQL GROUP BY语句

时间:2012-10-24 06:04:11

标签: mysql

我正在尝试加入一个包含布尔列的表,在我的结果中,我试图从连接中获取两列,一个布尔值为0,另一个列为1。 / p>

由于存在一对多的关系,我需要进行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...

我不明白为什么类型值被组合在一起而不是像第一个查询那样在各自的列中。

2 个答案:

答案 0 :(得分: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帮助我的大脑在那个上做出支点。

答案 1 :(得分:0)

这是一个非常基本的语句,可在带有GROUP BY子句的 Select 语句中应用 IF 条件。

GROUP_CONCAT( IF (condition, 1, 0)) col

随着GROUP_CONCAT返回多个,分隔的值。使用下面的语句行,我们可以避免重复的值

GROUP_CONCAT(DISTINCT IF (condition, 1, 0)) col