我正在尝试加入一个包含布尔列的表,在我的结果中,我试图从连接中获取两列,一个布尔值为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...
我不明白为什么类型值被组合在一起而不是像第一个查询那样在各自的列中。
答案 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