一起使用orderby和group

时间:2015-06-06 06:52:24

标签: mysql sql

如果我按照以下方式使用order by和group

select * from (SELECT * FROM `entry` ORDER BY jc_epoc DESC)as b GROUP BY type

此查询始终是否为每种类型提供了最大的timeStamp? 如果没有,什么是正确的查询?

1 个答案:

答案 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