我有一个使用分组依据的 SQL 查询。我想做的是引入一个额外的列,该列将结果集中所有列的 id 用 ,
分隔符连接起来。
我尝试过以下变体:
set @vals='';
select @vals:=concat(@vals,',',id),id,payment_num, sum(amount) from payments
group by id,payment_num,
having processed > 0;
我在第一列中不断收到null
。我尝试了 set @vals:=' '
即带有空格,但它也失败了。
我做错了什么。
我的目的是获取以逗号分隔返回的所有结果集的 id。
最佳答案
只需将 group_concat()
与子查询结合使用即可。它是为此目的而设计的:
select id, payment_num, sum(amount),
(select group_concat(id) from payments where processed > 0) as ids
from payments
where processed > 0
group by id, payment_num;
不过,我必须说,这是一个不寻常的请求。为什么您希望列出的 ID 仅分隔每一行,以及包含完整列表的列?
编辑:
你的评论是错误的。为了做你想做的事,你需要做这样的事情:
select id, payment_num, sum(amount),
(select group_concat(id) from payments having sum(processed > 0) = count(*)) as ids
from payments
group by id, payment_num
having sum(processed > 0) = count(*);
您的版本从任意行中选择processed
的值并将其用于比较。我的第一个版本将包含已 processed > 0
的任何组。此版本要求所有行均已processed > 0
。您可以使用以下方法之一获得相同的效果:
having min(processed > 0) > 0;
having min(processed > 0) = 1;
having min(processed > 0);
having max(processed <= 0) = 0;
我认为带有 count(*)
的版本是最容易阅读的。
编辑二:
解决仅从处理所有内容的组获取 id 的问题。因此,基本上将原始查询引入为子查询:
select id, payment_num, sum(amount),
(select group_concat(id)
from (select id, payment_num
from payments
group by id, payment_num
having sum(processed > 0) = count(*)
) idpn
) as ids
from payments
group by id, payment_num
having sum(processed > 0) = count(*);
这很恶心,但正如我在答案的第一个版本中所问的那样,将 id 列表放在每一行似乎是一个不寻常的需求,因为每个 id 都有一个单独的行。此外,您可能会得到重复项,因此您需要 group_concat(distinct id)
删除它们。
此外,大多数其他数据库都支持 with
语句,这将大大简化查询。
关于mysql - 尝试使用用户定义的变量获取连接的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20315077/