在找到一些字段值之前选择最后的记录

时间:2013-10-23 13:03:23

标签: mysql

如何在找到某个字段值之前从表中获取最后一个(谈论日期时间)记录? 如果我有这张桌子:

+----+---------------------+-------+-----------+
| id | date                |  flag | data      |
+----+---------------------+-------------------+
|  1 | 2008-09-01 15:02:00 |   1   | ....    . |
|  2 | 2008-09-01 16:15:00 |   5   | ....    . |
|  3 | 2008-09-01 16:19:00 |   4   | ....    . |
|  4 | 2008-09-01 16:20:00 |   4   | ....    . |
|  5 | 2008-09-01 16:20:00 |   5   | ....    . |
|  6 | 2008-09-01 18:18:00 |   9   | ....    . |
+----+---------------------+-------+-----------+  

我想在找到“4”标志字段值之前得到最后的记录,我的意思是:

SELECT * FROM mytable WHERE..... ORDER BY id DESC

+----+---------------------+-------+-----------+
| id | date                |  flag | data      |
+----+---------------------+-------------------+
|  5 | 2008-09-01 18:18:00 |   9   | ....    . |
|  4 | 2008-09-01 16:20:00 |   5   | ....    . |
+----+---------------------+-------+-----------+ 

我怎样才能得到它?

补充:另外我知道如何获得第一次出现“4”的记录 补充:标志字段没有有序值
谢谢

2 个答案:

答案 0 :(得分:2)

因为它是关于降序的,所以只需:

SELECT * FROM mytable WHERE flag>4 ORDER BY id DESC

关于你的'添加' - 在SQL方面没有'第一个'记录,因为当我们说到订单时它们都是相同的。即您应该首先在相同的flag值内指定顺序,然后您就可以确定哪一行是第一行。

基于评论

如果我们谈论使用date字段进行排序,那将是:

1)获取date字段大于date 4的所有记录 - 标记行:

SELECT 
  * 
FROM 
  mytable 
WHERE 
  `date`>(SELECT MAX(`date`) FROM mytable WHERE flag=4) 
  AND 
  flag!=4

2)获取date字段大于最大date的所有记录4 - 标记行并包含此行:

SELECT 
  * 
FROM 
  mytable 
WHERE 
  `date`>(SELECT MAX(`date`) FROM mytable WHERE flag=4)
  AND
    flag!=4
UNION ALL
SELECT 
  * 
FROM 
  mytable 
WHERE 
  `date`=(SELECT MAX(`date`) FROM mytable WHERE flag=4) 
  AND 
  flag=4

-note,在第二种情况下,我们不能只执行SELECT * FROM mytable WHERE date>=(SELECT MAX(date) FROM mytable WHERE flag=4),因为可能有date字段的行与date 4的最大值相同-flag行,但带有另一个标志。

答案 1 :(得分:2)

如果您的ID总是订购,您可以使用以下内容:

SELECT *
FROM mytable
WHERE id>(SELECT MAX(id) FROM mytable WHERE flag="4")

或者您可以使用日期时间字段:

SELECT *
FROM mytable
WHERE
  date>=(SELECT MAX(date) FROM mytable WHERE flag="4")
  AND flag!="4"

和第一次出现“4”的记录:

SELECT *
FROM mytable
WHERE date=(SELECT MIN(date) FROM mytable WHERE flag="4")