如果一个字段为NULL,GROUP_CONCAT返回一行NULL。

3

我正在尝试从不同的表中选择字段,并使用GROUP_CONCAT()分组行。但是,如果GROUP_CONCAT()中的一个字段返回NULL,则所选整行将为NULL。

'achievement'和'social'中的字段允许为空。每个个人资料中可能有多行成就和社交信息。

我尝试使用COALESCE更改查询,但没有成功:

  SELECT p.UserId, p.Username, p.TextInfo,   GROUP_CONCAT(DISTINCT CONCAT(COALESCE(a.Rank,''), '#', COALESCE(a.Tourney,''))) AS achievements,    GROUP_CONCAT(DISTINCT CONCAT(COALESCE(s.platform,''),'#', COALESCE(s.URL,''))) AS socials   from profile p   INNER JOIN achievement a ON p.UserId = a.UserId   INNER JOIN social s ON p.UserId = s.UserId   WHERE p.Username LIKE '%uagib%'

预期结果:
<UserId> | <Username> | <TextInfo> | (multiple) <Rank>#<Tourney> | (multiple) <Platform>#<URL> |

分享示例数据和预期输出 - undefined
1
应该返回一个非空值。移除group concat并将包括这4列的select查询结果发布出来。 - undefined
@SalmanA 我移除了group_concat,现在返回了所有的空字段。当我尝试使用group by时,情况也是一样的。 - undefined
如果你想要我们提供更多帮助,我们确实需要一小段数据样本。你的查询不应该返回空字段,可能是查询或数据出了问题,但没有数据我们无法找到问题所在。 - undefined
2个回答

3

缺少Group by子句

SELECT p.UserId, p.Username, p.TextInfo,   
GROUP_CONCAT(DISTINCT CONCAT(COALESCE(a.Rank,''), '#', COALESCE(a.Tourney,''))) AS achievements,    
GROUP_CONCAT(DISTINCT CONCAT(COALESCE(s.platform,''),'#', COALESCE(s.URL,''))) AS socials   
from profile p INNER JOIN achievement a ON p.UserId = a.UserId   
INNER JOIN social s ON p.UserId = s.UserId   
WHERE p.Username LIKE '%uagib%'
group by p.UserId, p.Username, p.TextInfo

这将返回一个带有空字段的行。 - undefined

1
我会推荐使用子查询来解决这个问题。
SELECT p.UserId, p.Username, p.TextInfo, 
       (SELECT GROUP_CONCAT(COALESCE(a.Rank, ''), '#', COALESCE(a.Tourney, ''))
        FROM achievement a 
        WHERE p.UserId = a.UserId
       ) as achievements,
       (SELECT GROUP_CONCAT(COALESCE(s.platform, ''), '#', COALESCE(s.URL, ''))
        FROM social s 
        WHERE p.UserId = s.UserId 
       ) as socials   
FROM profile p  
WHERE p.Username LIKE '%uagib%';

注意:

  • 即使用户缺少属性和/或社交信息,这也将检索到他们。
  • DISTINCT 可能是不必要的,因为在两个独立维度上连接时没有部分笛卡尔积。
  • CONCAT() 是不必要的。 GROUP_CONCAT() 可以接受多个参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接