我正在运行以下查询,以根据同一表中的日期字段检索唯一的最新结果。但是当表在增长时,这个查询会花费太多时间。欢迎提出任何改进建议。
select
t2.*
from
(
select
(
select
id
from
ctc_pre_assets ti
where
ti.ctcassettag = t1.ctcassettag
order by
ti.createddate desc limit 1
) lid
from
(
select
distinct ctcassettag
from
ctc_pre_assets
) t1
) ro,
ctc_pre_assets t2
where
t2.id = ro.lid
order by
id
我们的 able 可能多次包含同一行,但每一行都有不同的时间戳。我的对象基于单个列,例如 assettag 我想为每个具有最新时间戳的 assettag 检索单行。
最佳答案
找到每个 ctcassettag
的最新日期,然后返回以找到匹配的整行,这更简单,而且可能更快。
这确实假定没有 ctcassettag
有多行具有相同的 createddate
,在这种情况下,您可以每个返回不止一行ctcassettag
.
SELECT
ctc_pre_assets.*
FROM
ctc_pre_assets
INNER JOIN
(
SELECT
ctcassettag,
MAX(createddate) AS createddate
FROM
ctc_pre_assets
GROUP BY
ctcassettag
)
newest
ON newest.ctcassettag = ctc_pre_assets.ctcassettag
AND newest.createddate = ctc_pre_assets.createddate
ORDER BY
ctc_pre_assets.id
编辑:处理具有相同日期的多行。
如果在同一 createddate
上有多个行用于同一 ctcassettag
,您实际上还没有说明如何选择您想要的行。因此,此解决方案只是从那些 duplicates
中选择具有最低 id
的行。
SELECT
ctc_pre_assets.*
FROM
ctc_pre_assets
WHERE
ctc_pre_assets.id
=
(
SELECT
lookup.id
FROM
ctc_pre_assets lookup
WHERE
lookup.ctcassettag = ctc_pre_assets.ctcassettag
ORDER BY
lookup.createddate DESC,
lookup.id ASC
LIMIT
1
)
这仍然使用相关子查询,它比简单的嵌套子查询慢(例如我的第一个答案),但它确实处理与“重复”。
您可以通过更改相关子查询中的 ORDER BY
来更改选择行的规则。
它也与您自己的查询非常相似,但少了一个连接。
关于mysql - 查询运行时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40525660/