Mysql Having子句中使用组Concat之和

Mysql Having子句中使用组Concat之和,mysql,sql,csv,group-by,having-clause,Mysql,Sql,Csv,Group By,Having Clause,我想找到组_concat之和为0的所有ID。这是我的简化表 ╔════╦════╦══════════════╦ ║ id ║ did║ group_concat ║ ╠════╬════╬══════════════╬ ║ 1 ║ 1 ║ 1,1,1 ║ ║ 2 ║ 1 ║ 0 ║ ║ 3 ║ 2 ║ 1,-1 ║ ║ 4 ║ 2 ║ 1,-1,0 ║ ║ 5 ║ 2 ║ 0,0,0 ║ ║ 6

我想找到组_concat之和为0的所有ID。这是我的简化表

╔════╦════╦══════════════╦
║ id ║ did║ group_concat ║
╠════╬════╬══════════════╬
║  1 ║  1 ║ 1,1,1        ║
║  2 ║  1 ║ 0            ║
║  3 ║  2 ║ 1,-1         ║
║  4 ║  2 ║ 1,-1,0       ║
║  5 ║  2 ║ 0,0,0        ║
║  6 ║  3 ║ 2,-2         ║
║  7 ║  3 ║ 1,-1,0       ║
║  8 ║  3 ║ 0,0,0        ║
╚════╩════╩══════════════╩
我想知道,在相同的DID中,群的和是0。如果任何DID中的组concat之和不等于零,则不应将其放在表上

为了更好地理解,下表如下

╔═════╦═════════════════════╦
║ did ║ sum of group_concat ║
╠═════╬═════════════════════╬
║  2  ║ 0                   ║
║  3  ║ 0                   ║
╚═════╩═════════════════════╩
这就是我试图使用的查询语句

select sum(val)
from user
group by did
having sum(val) = 0
组_concat中的总和似乎不可用

有什么有效的方法吗

提前谢谢

只需使用
sum()

编辑:

您是否还需要以下条件:

having sum(val) = 0 and max(val) > 0

SUM和所有其他聚合函数用于跨行组进行计算;在一个字段中不求多个值的和

在一个字段中有多个值是一种反模式,可能是关系数据库中可用性最差的模式之一


在查询中,没有简单的方法可以完成您想要的操作;SQL并不是为这些类型的操作而设计的。(“那些操作”正在将逗号分隔的整数值字符串解析为整数列表。)对于纯SQL答案,您最好希望的是一个存储函数,它接受一个字符串,并使用过程逻辑解析字符串中的值,然后求和。)

一个解决方案涉及使用数字表取消csv列表的测试:

select
    t.did,
    sum(substring_index(substring_index(grp_concat, ',', n.n), ',', - 1)) sum_of_grp_concat
from mytable t
inner join (select 1 n union all select 2 union all select 3 union all select 4 union all select 5) n
    on n.n <= 1 + char_length(grp_concat) - char_length(replace(grp_concat, ',', ''))
group by t.did
having sum_of_grp_concat = 0

如果您要修复模式,以便将每个csv值存储在单独的表行中,则此任务将更加容易。在数据库列中存储csv列表是一种典型的SQL反模式:在本主题中,我建议您阅读。

您使用的是哪个版本的MySQL?
SUM(GROUP_CONCAT(val))
毫无意义。我想你的意思是
SUM(val)
@Barmar谢谢你的意见。但我想避免坐第二排。如果我只使用Sum(val),那么它也会得到(id=2)。有两个问题:不能嵌套聚合函数。而
SUM()
期望参数是一个数字,但
1,1,1
不是一个数字。它会将其转换为一个数字,并忽略逗号后的所有内容。表中的
val
列在哪里?感谢您的反馈。但是如果我在have中只使用sum(val),它还会显示第二行(id=2),似乎他已经改变了问题。最初它是
GROUP\u CONCAT(val)
,因此它是跨多行连接的。是的,从问题中不清楚,因为他提供的数据中没有一个实际的
val
数据点。
select
    t.did,
    sum(substring_index(substring_index(grp_concat, ',', n.n), ',', - 1)) sum_of_grp_concat
from mytable t
inner join (select 1 n union all select 2 union all select 3 union all select 4 union all select 5) n
    on n.n <= 1 + char_length(grp_concat) - char_length(replace(grp_concat, ',', ''))
group by t.did
having sum_of_grp_concat = 0
did | sum_of_grp_concat --: | ----------------: 2 | 0 3 | 0