0
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

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

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

如何将三个 MySQL 查询合二为一?

这个问题得到了完美的回答,但不适用于这种类型的查询。

4

7 回答 7

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 语法

于 2012-09-20T17:54:08.897 回答
1
select 
    (select min(gmt) from history.cachemap),
    (select max(gmt) from history.cachemap)
于 2012-09-20T17:55:49.590 回答
1

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

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

使用索引gmt,在 MySQL 中,它应该是即时的。

于 2012-09-20T17:57:40.007 回答
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 不会以指定的顺序返回行,因此您应该包含有关哪个是哪个的信息(或显式排序)。

于 2012-09-20T17:58:32.173 回答
1

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

SELECT MIN(gmt), MAX(gmt) FROM history.cachemap
于 2012-09-20T17:58:34.857 回答
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;
于 2012-09-20T17:55:25.750 回答
0

如果 history.cachemap 包含数百万条记录(行),使用它可能会更好

SELECT gmt FROM history.cachemap WHERE gmt = max(gmt) OR gmt = min(gmt) ...

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

于 2012-09-20T17:58:11.447 回答