如果我按照以下方式使用order by和group
select * from (SELECT * FROM `entry` ORDER BY jc_epoc DESC)as b GROUP BY type
此查询始终是否为每种类型提供了最大的timeStamp? 如果没有,什么是正确的查询?
答案 0 :(得分:1)
不,它不应该但显然它确实更有效。您的查询的真正问题在于理论上它违反了1NF。假设mysql总是在这种情况下选择第一行,那么您可以设计查询,但实际上它可能会有所不同,并且不像文档中所建议的那样可靠。选择并非总是相同的非聚合列时, MySql可以自由选择任何值,因此实际显示的结果值是不确定的。
该问题需要更清楚地说明每种类型需要多少行,例如,每种类型存在多个最大值实例。但是我对你正在尝试的内容有一个模糊的想法 - “你希望得到每种类型的最大值以及该行的所有其他列值 “
要进行确定的查询,我会这样做 - 如果每种类型的多行很好
SELECT *
FROM entry e1
WHERE (e1.type, e1.jc_epoc) IN
( SELECT e.type, MAX(e.jc_epoc)
FROM entry e
GROUP BY e.type
)
如果每种类型的多行不合适,则必须使用键值来获取单个值
SELECT e2.*
FROM entry e2
LEFT OUTER JOIN entry e3
ON e3.jc_epoc >= e2.jc_epoc
AND e3.type = e2.type
AND e3.id > e2.id
WHERE e3.id IS NULL
注意: - 上面的查询可能有更多优化。对于更清晰/简明的要求,查询可能具有优化版本 例如,每个类型只需要MAX(jc_epoc),没有其他列值
SELECT e.type, MAX(e.jc_epoc)
FROM entry e
GROUP BY e.type
随意SQLFiddle it。