gpt4 book ai didi

mysql - 尝试使用用户定义的变量获取连接的主键

转载 作者:行者123 更新时间:2023-11-30 00:58:51 32 4
gpt4 key购买 nike

我有一个使用分组依据的 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com