如何在找到某个字段值之前从表中获取最后一个(谈论日期时间)记录? 如果我有这张桌子:
+----+---------------------+-------+-----------+
| 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”的记录
补充:标志字段没有有序值
谢谢
答案 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")