【发布时间】:2020-12-29 22:56:28
【问题描述】:
为了获取某个标识符组合的最新记录,我使用以下查询:
SELECT t1.*
FROM (
SELECT id, b_id, c_id
FROM a
ORDER BY epoch DESC
LIMIT 18446744073709551615
) AS t1
GROUP BY t1.b_id, t1.c_id
如果b_id + c_id 的组合有多个记录,那么它总是会选择具有最高值epoch 的记录(因此,最晚的时间)。
LIMIT 添加为解决方法to force MariaDB to actually order the results。我在我的应用程序中成功地大量使用了这种结构,others 也是如此。
但是,现在我在我的应用程序中遇到了完全相同的查询,我“不小心”使用了比子查询中严格必要的列更多的列:
SELECT t1.*
FROM (
SELECT id, b_id, c_id, and, some, other, columns, ...
FROM a
ORDER BY epoch DESC
LIMIT 18446744073709551615
) AS t1
GROUP BY t1.b_id, t1.c_id
我已经测试了这两个查询。完全相同的查询,但只更改那些额外的列,会使结果变得不正确。实际上,列数决定了结果。如果我有 a 的总数)。在我的测试中,删除或添加哪一列似乎并不重要。
我很难找出为什么在我添加更多列后行为会发生变化。另外,也许是偶然的,它昨天仍然给出了正确的结果。但是今天突然结果发生了变化,可能是在将新记录(具有不相关的标识符)添加到表a 之后。我试过使用EXPLAIN:
# The first query, with columns: id, b_id, c_id
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 280 Using where; Using temporary; Using filesort
2 DERIVED a ALL NULL NULL NULL NULL 280 Using filesort
# The second query, with columns: id, b_id, c_id, and, some, other, columns, ...
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 276 Using where; Using temporary; Using filesort
2 DERIVED a ALL NULL NULL NULL NULL 276 Using filesort
但这并没有真正帮助我,除了我可以看到key_len 是不同的。在第二个查询中错误接收的第二个最新记录是 id = 276,它使用第一个查询正确检索的实际最新记录是 id = 278。现在总共有 307 行,而昨天可能只有约 300 行。我不确定如何解释这些结果以了解出了什么问题。有人知道吗?如果没有,我还能做些什么来找出导致这些奇怪结果的原因?
【问题讨论】:
-
请通过包含示例输入和输出数据来使这个问题成为一个完整的问题。
标签: mysql sql mariadb sql-order-by greatest-n-per-group