将这两个查询合并为一个的正确方法是什么?

时间:2012-09-20 17:51:53

标签: mysql sql

select gmt from history.cachemap order by gmt asc limit 0,1;
..this returns gmt: 2012-05-03
select gmt from history.cachemap order by gmt desc limit 0,1;
..this returns gmt: 2012-09-15

我正在使用的数据库的一些背景知识,我正试图从几百万条记录的列表中获取最早和最新的日期字段。

本周早些时候,我发布了这个问题:

How to combine three MySQL queries into one?

这个问题得到了很好的回答,但不适用于此类查询。

7 个答案:

答案 0 :(得分:1)

(select gmt from history.cachemap order by gmt asc limit 0,1)
UNION
(select gmt from history.cachemap order by gmt desc limit 0,1)

文档:UNION syntax

答案 1 :(得分:1)

select 
    (select min(gmt) from history.cachemap),
    (select max(gmt) from history.cachemap)

答案 2 :(得分:1)

更有效的方法,但返回两列而不是一列,将是:

select MIN(gmt) AS mingmt, MAX(gmt) AS maxgmt
   FROM history.cachemap;

gmt上建立索引,在MySQL中,它应该是非常即时的。

答案 3 :(得分:1)

我认为最好的方法是使用max和min函数。您可以将结果作为一行获得:

select min(gmt), max(gmt)
from history.cachemap

这是最有效的解决方案,因为它只涉及一次数据传递。

或者,您可以使用union all:

将其分为两行
select 'min' as which, min(gmt)
from history.cachemap union all
select 'max', max(gmt)
from history.cachemap

UNION / UNION ALL不会按指定的顺序返回行,因此您应该包含哪些信息(或明确命令)。

答案 4 :(得分:1)

这可以在单个查询中完成,如下所示:

SELECT MIN(gmt), MAX(gmt) FROM history.cachemap

答案 5 :(得分:0)

你可以这样做:

SELECT GMT FROM HISTORY.CACEMAP ORDER BY GMT DESC LIMIT 0,1 UNION SELECT GMT FROM HISTORY.CACEMAP ORDER BY GMT ASC LIMIT 0,1;

答案 6 :(得分:0)

如果history.cachemap包含数百万条记录(行),那么使用

可能会更好
SELECT gmt FROM history.cachemap WHERE gmt = max(gmt) OR gmt = min(gmt) ...

类似的东西..注意,使用UNION你实际上对同一个表做了两次同样的查询,其中包含数百万条记录..