![](/img/trans.png)
[英]mysql group_concat returns null row if one entry in the group is null
[英]GROUP_CONCAT returns a row of NULLs if one field is NULL
我正在嘗試 select 來自不同表的字段並使用 GROUP_CONCAT() 對行進行分組。 但是,如果 GROUP_CONCAT() 中的字段之一返回 NULL,則所選的整行將為 NULL。
“成就”和“社交”中的字段可以為空。 每個個人資料可以有多行成就和社交。
我嘗試使用 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> |
缺少 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
我會為此推薦子查詢:
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()
接受多個 arguments。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.