gpt4 book ai didi

mysql - 检查每个组是否存在不同的值

转载 作者:行者123 更新时间:2023-11-29 21:55:06 25 4
gpt4 key购买 nike

编辑:

假设我在 MySQL 中有下表:

CREATE TABLE `events` (
`pv_name` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL,
`time_stamp` bigint(20) UNSIGNED NOT NULL,
`value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
PRIMARY KEY (`pv_name`, `time_stamp`)
) ENGINE=InnoDB;

我可以使用以下查询找到此表中具有多个不同的每个pv_name:

SELECT events.pv_name
FROM events
GROUP BY events.pv_name
HAVING COUNT(DISTINCT events.value) > 1;

问题是该查询效率不高。它会计算所有不同的值,而不是在找到多个值后停止。

一项建议如下:

SELECT events.pv_name
FROM events
GROUP BY events.pv_name
HAVING MIN(events.value) < MAX(events.value);

如果索引包含,则此方法非常有效。但是,value 是文本列,因此不能。

是否有另一种方法可以使搜索更有效?也许某种形式的相关子查询?我想继续使用 MySQL,但如果另一个数据库服务器中有一个功能可以帮助我,我可能会考虑转向它。

最佳答案

要回答您的问题,最好避免group bydistinct。不过,首先,我建议为表添加一个自动递增的 event_id 。这使得可以确定两行是否相同。

所以,我建议以下查询:

select e.*
from events e
where e.time_stamp between $ts1 and $ts2 and
exists (select 1
from events e2
where e2.pv_name = e.pv_name and
e2.time_stamp between $ts1 and $ts2 and
e2.event_id < e.event_id
);

您还需要索引:events(time_stamp, pv_name, event_id)events(pv_name, time_stamp, event_id)

这会找到成对的事件。您可以使用选择不同的 pv_name。但是,这会导致大量额外的处理来删除重复项。

关于mysql - 检查每个组是否存在不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33226821/

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