MySQL按相同wallet_id分组展示数据的实现咨询
解决SQL分组展示重复字段空值的问题
你用GROUP BY的思路错了——GROUP BY的作用是聚合数据(比如计算每组的存款总和、记录数),不是用来做这种重复字段空值的格式化展示。你写的SQL本身不符合SQL标准(SELECT中的非聚合列id、wallet_name不在GROUP BY子句中),不同数据库要么报错,要么返回每组的随机一条记录,自然达不到你要的效果。
要实现你预期的展示效果,应该用窗口函数或变量标记每组的第一条记录,再控制wallet_id的显示:
支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server等)
SELECT CASE WHEN rn = 1 THEN wallet_id ELSE '' END AS wallet_id, id, wallet_name FROM ( SELECT wallet_id, id, wallet_name, ROW_NUMBER() OVER (PARTITION BY wallet_id ORDER BY id) AS rn FROM wallet ) t ORDER BY wallet_id, id;
不支持窗口函数的数据库(如MySQL 5.x)
SELECT IF(@prev_wallet_id = wallet_id, '', wallet_id) AS wallet_id, id, wallet_name, @prev_wallet_id := wallet_id FROM wallet, (SELECT @prev_wallet_id := '') t ORDER BY wallet_id, id;
逻辑说明
- 窗口函数方案:子查询中通过
ROW_NUMBER() OVER (PARTITION BY wallet_id ORDER BY id)给每个wallet_id分组内的记录按id排序并分配行号,组内第一条记录行号为1;外层用CASE判断,行号为1时显示wallet_id,否则显示空字符串,最终按wallet_id和id排序得到目标格式。 - 变量方案:通过自定义变量
@prev_wallet_id记录上一条的wallet_id,对比当前记录的wallet_id,相同则显示空,否则显示当前wallet_id,同时更新变量值,最后排序得到结果。
内容的提问来源于stack exchange,提问作者Dedy Puji
相关产品推荐
相关产品推荐

