gpt4 book ai didi

Mysql WHERE IN() 子句必须对重复出现的次数求和

转载 作者:行者123 更新时间:2023-11-29 12:48:03 25 4
gpt4 key购买 nike

我有一个以逗号分隔的 ID 列表,必须在 mysql (Percona Xtra DB) 的 IN() 子句内使用,类似于:

SELECT sum(p_views) as total_views FROM table WHERE id IN (1,1,3,5,5,5,7)

在上面的示例中,id 1 和 5 将仅求和一次,而不是实际出现的次数。重复项的数量未知,范围为 2 到 20000。

我如何让mysql将它们视为唯一的数字,并相应地对它们求和,无论它们是否都是唯一的,或者列表是否由单个ID组成,20000次?

最佳答案

这不能通过 IN () 谓词来完成。这只会检查给定的行是否满足谓词;它不会“重复”返回的​​行。

要返回“重复”行(以便可以在 SUM() 聚合中累积值),您需要另一个行源。

一种选择是对内联 View 使用 JOIN 操作,而不是 IN() 列表谓词。

SELECT SUM(t.p_views) AS total_views
FROM table t
JOIN
( SELECT 1 AS id
UNION ALL SELECT 1
UNION ALL SELECT 1
UNION ALL SELECT 3
UNION ALL SELECT 5
UNION ALL SELECT 5
UNION ALL SELECT 5
UNION ALL SELECT 7
) c
ON c.id = t.id

另一个(可能更有效)选项(如果有很多重复值)是使用“计数”来代替重复值并相乘,例如

SELECT SUM(t.p_views*c.cnt) AS total_views
FROM table t
JOIN
( SELECT 1 AS id, 2 AS cnt
UNION ALL SELECT 3 , 1
UNION ALL SELECT 5 , 3
UNION ALL SELECT 7 , 1
) c
ON c.id = t.id

如果此信息已在另一个行源中可用,则您可以通过在查询中使用该行源(如果有适当的索引可用)来提高性能,并避免生成困惑的“硬编码”UNION ALL 内联 View ,不会被索引(除非 Percona 已经为内联 View 实现了索引。)

我确信还有其他方法。

但最重要的是,它不能通过 IN() 列表谓词来完成。查询结果如下:

WHERE id IN (1)

将与查询结果相同:

WHERE id IN (1,1,1,1)

因为,对于每一行,这两个谓词都将计算为 TRUEFALSENULL。无法返回 IN() 比较中匹配的项目的“次数”。

关于Mysql WHERE IN() 子句必须对重复出现的次数求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25168644/

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