簡體   English   中英

如果一個字段是 NULL,GROUP_CONCAT 返回一行 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM