gpt4 book ai didi

mysql - 检索每个组中的索引数据或最后一条记录

转载 作者:行者123 更新时间:2023-12-03 19:08:24 25 4
gpt4 key购买 nike

有一张 table routes包含如下所示的数据:

Id   GroupID   TickID   Data
-------------------------
1 1 1 A
2 1 2 B
3 1 3 C
4 2 1 D
5 2 2 E
6 3 1 F
我有一个 PHP 文件,用户应该能够在其中传递“TickID”,然后脚本应该返回:对于每个 GroupID,用户给定 TickID 的数据,但如果用户传递的 TickID 大于某个 GroupID 中的最大 TickID,而不是应该返回该特定 GroupID 的最后一行。
IE。
用户输入,TickID 1,返回
Id   GroupID   TickID   Data
-------------------------
1 1 1 A
4 2 1 D
6 3 1 F
用户输入,TickID 3,返回
Id   GroupID   TickID   Data
-------------------------
3 1 3 C
5 2 2 E
6 3 1 F
我找到了如何选择“最新”行,即每个 GroupID 的最大 TickID,这里已经有良好的性能: Retrieving the last record in each group - MySQL
但我不确定如何将它与中间的一系列行结合起来。
编辑
我现在拥有的是:
进行 3 次查询:
第一个查询:为每个组选择最大的 TickID SELECT GroupID, MAX(TickID) maxTick From routes GROUP BY GroupID比做两个查询:
一种用于 GroupsIDs,它在数据库中有一个大于用户输入的 TickID 条目 -> SELECT GroupID, Data From routes WHERE TickID = userTickID GROUP BY GroupID并对没有用户给定的 TickID 的组进行另一个查询:为这些组选择最大的 TickID。
类似于 Retrieving the last record in each group - MySQL
似乎是一个大的非执行者。
有什么想法可以改进它吗?

最佳答案

我会将您的查询表述为:

SELECT r1.*
FROM routes r1
INNER JOIN
(
SELECT GroupID, MAX(TickID) AS MaxTickID
FROM routes
GROUP BY GroupID
) r2
ON r1.GroupID = r2.GroupID AND
(r1.TickID = userTickID OR
(r1.TickID = r2.MaxTickID AND r2.MaxTickID < userTickID));
这里的逻辑是对每个组连接方法的规范最大值的轻微影响。这里我们取 TickID只有当用户刻度 ID 大于最大值时,这是组中的最大值。否则,我们取 TickID 的记录。匹配输入的用户值。
routes 上添加以下索引应该大大加快最大子查询:
CREATE INDEX idx ON routes (GroupID, TickID);

关于mysql - 检索每个组中的索引数据或最后一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62978868/

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