利用非空值組合對MySQL行進行分組的方法
P粉002023326
P粉002023326 2023-09-06 21:35:03

如何透過選擇分組結果中每列的最新非空值來合併/組合行?

id 用戶 水果 數字 建立時間
1 蘋果 2022-01-01
2 約翰 西瓜 32 2022-01-02
3 約翰 72 2022-01-03
4 約翰 梨子 2022-01-04

以下方法不起作用:

SELECT
  user,
  COALESCE(fruit) as fruit,
  COALESCE(number) as number,
FROM mytable
GROUP BY user
ORDER BY created_at DESC

我希望結果是:

Jane   Apple   Null
John   Pear    72

問題在於COALESCE()函數不適用於值集,而只適用於清單。

許多主題提到使用MIN()或MAX()而不是COALESCE()作為解決方案。但這不能解決問題,因為我需要新值來覆蓋舊值,而不是最低或最高值。

P粉002023326
P粉002023326

全部回覆(1)
P粉979586159

由於COALESCE()不是一個聚合函數,而只能使用給定的值列表,我在這個帖子中找到了@jsowa的解決方法:為什麼「COALESCE」不能與“GROUP BY”一起使用?

我們可以使用SUBSTRING_INDEX(GROUP_CONCAT())來取代COALESCE()

請特別注意GROUP_CONCAT()中的ORDER BY子句。 缺點是分隔符號必須是任何值中未使用的字元。

SELECT
  user,
  SUBSTRING_INDEX(GROUP_CONCAT(fruit ORDER BY created_at DESC SEPARATOR '|'), '|', 1) AS fruit,
  SUBSTRING_INDEX(GROUP_CONCAT(number ORDER BY created_at DESC SEPARATOR '|'), '|', 1) AS number,
FROM mytable
GROUP BY user;

回傳結果

Jane   Apple   Null
John   Pear    72
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!