2

我正在尝试加入一个具有布尔列的表,在我的结果中,我试图从连接中获取两列,一个是布尔值为 0,另一个是 1。

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

我不明白的是为什么流派值被分组在一起,而不是像第一个查询那样在它们各自的列中。

4

2 回答 2

2
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 帮助我的大脑在那个语句上做出了支点。

于 2012-10-24T06:28:29.057 回答
0

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

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

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

GROUP_CONCAT(DISTINCT IF (condition, 1, 0)) col
于 2020-08-24T07:53:30.973 回答