如何从MySQL表中找到第一条和最后一条记录

23

我有一张表,我想找到满足特定月份条件的第一条和最后一条记录。


1
多个答案可行,请选择一个。 - Bob van Luijt
6个回答

34
SELECT 
(SELECT column FROM table WHERE [condition] ORDER BY column LIMIT 1) as 'first',
(SELECT column FROM table WHERE [condition] ORDER BY column DESC LIMIT 1) as 'last'

这在我需要选择事件系列的第一个和最后一个日期时对我有用。

29

只有在将查询结果按字段排序后,第一个和最后一个才有意义。

要获取第一条记录:

select col1 from tab1 order by col1 asc limit 1;

获取最后一条记录:

select col1 from tab1 order by col1 desc  limit 1;

简单明了。谢谢。 - Abhishek Singh
这不是只有在表按某一列排序时才能做到吗?如果根本没有排序,怎么办? - Aunny

15

那么可以考虑类似这样的方法:

select 'first', f1, f2, f3, f4 from tbl
    order by f1 asc, f2 asc
    limit 1
union all
select 'last', f1, f2, f3, f4 from tbl
    order by f1 desc, f2 desc
    limit 1

where 子句中可以随意添加任何条件,但是 order by 的基本前提是反转两个 select 部分的顺序。

limit 子句将只获取两种情况下的第一行。由于您已经颠倒了排序顺序,这恰好是第二个 select 集合中集合的最后一行。

如果仅有一个满足条件的行且不希望返回两次,请使用 union 而不是 union all


1
括号怎么办? - Alexander Busygin
1
@Alexander,是的,括号非常好,有着流畅的感觉。如果它们能平衡地使用,它们也非常吸引人。但是,对于我的答案并不是必需品,所以我现在会将它们从等式中省略掉 :-) - paxdiablo
3
没有括号会导致异常 SQLSTATE[HY000]: General error: 1221 Incorrect usage of UNION and ORDER BY - piotr_cz
2
我不知道在5.5之前的任何版本中是否有效。但至少从5.5开始,您需要使用括号。这在5.58.0中都有记录:“要将ORDER BYLIMIT应用于单个SELECT,请将该子句放置在括住SELECT的括号内”。此外,UNION(DISTINCT)不会改变任何内容,因为firstlast已经是不同的。 - Paul Spiegel

10
select * from table
where id = (select id from tab1 order by col1 asc limit 1) or
id = (select id from tab1 order by col1 desc  limit 1);

你的子查询中的分号会破坏这个语句。 - dangermark

0

试试这个:例如你想根据group_col对表进行分组,并获取value_col的第一个和最后一个值:

select substring_index(group_concat(value_col), ',',1) as 'first',
        substring_index(group_concat(value_col), ',',-1) as 'last' 
from table
group by group_col

-1
SELECT * FROM (
    SELECT first_name, LENGTH(first_name) FROM Employees
    ORDER BY LENGTH(first_name) ASC
    FETCH FIRST 1 rows ONLY)
UNION
SELECT * FROM (
    SELECT first_name, LENGTH(first_name) FROM Employees
    ORDER BY LENGTH(first_name) DESC
    FETCH FIRST 1 rows ONLY)
ORDER BY 2 desc;

4
"FETCH FIRST" 不是有效的 MySQL 语法。 - Blue
@FrankerZ:感谢指出。是的,FETCH FIRST 是针对 Oracle Sql 的。 - Nikita Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接