如何从mysql表中查找第一个和最后一个记录

che*_*tan 18 mysql

我有一个表,我想找到满足特定月份标准的第一个和最后一个记录.

cod*_*ict 25

只有在对字段进行排序的查询输出时,才能使用第一个和最后一个.

获得第一条记录:

select col1 from tab1 order by col1 asc limit 1;
Run Code Online (Sandbox Code Playgroud)

要获得最后的记录:

select col1 from tab1 order by col1 desc  limit 1;
Run Code Online (Sandbox Code Playgroud)


bde*_*eta 22

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'
Run Code Online (Sandbox Code Playgroud)

当我需要选择事件系列中的第一个和最后一个日期时,这对我有用.


pax*_*blo 12

怎么样的:

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
Run Code Online (Sandbox Code Playgroud)

显然可以自由地在一个where子句中添加你想要的任何条件,但基本的前提order by是在两个select部分中颠倒顺序.

limit子句只会在两种情况下获得第一行.这恰好是第二行中的最后一行,select因为你已经颠倒了顺序.

如果您的条件只有一行,并且您不希望它返回两次,请使用union而不是union all.

  • 如果没有括号,我会收到异常“SQLSTATE[HY000]:一般错误:1221 UNION 和 ORDER BY 的错误使用” (3认同)
  • 我不知道这是否在 5.5 之前的版本中有效。但至少从 5.5 开始你需要括号。[5.5](https://dev.mysql.com/doc/refman/5.5/en/union.html) 以及 [8.0](https://dev.mysql.com/doc/ refman/8.0/en/union.html): "*要将 `ORDER BY` 或 `LIMIT` 应用于单个 `SELECT`,请将子句放在包含 `SELECT` 的括号内*"。另外,“UNION (DISTINCT)”不会改变任何内容,因为“first”和“last”已经不同。 (2认同)

Sal*_*lil 7

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);
Run Code Online (Sandbox Code Playgroud)