如何从一个以前的记录中选择mysql中的记录

时间:2017-06-27 15:29:43

标签: mysql sql

我有这样的表

+----+----------------------+------------+
| id | desc                 | date       |
+----+----------------------+------------+
| 15 | nah_i_kid            | 2017-06-07 |
+----+----------------------+------------+
| 17 | it_is_just_the_cat   | 2017-06-08 |
+----+----------------------+------------+
| 18 | thank_God            | 2017-06-09 |
+----+----------------------+------------+
| 44 | no_kidding           | 2017-06-10 |
+----+----------------------+------------+

我的sql是

  

SELECT * FROM TABLE WHERE日期介于'2017-06-09'和'2017-06-12'

之间

我希望结果也应该包含一个以前的记录(i-e记录有id = 17以示例为准)
感谢。

4 个答案:

答案 0 :(得分:0)

如果您想要上一个日期的记录,您可以这样做:

select t.*
from t
where date > (select max(t2.date) from t t2 where t2.date < '2017-06-09') and
      date <= '2017-06-12';

假设您在某个日期没有重复项,这就是您想要的。

如果您只需要一行,并且您知道按时间顺序分配ID,则可以执行以下操作:

select t.*
from t
where id > (select max(t2.id) from t t2 where t2.date < '2017-06-09') and
      date <= '2017-06-12';

这可以通过根据id获取最新的上一条记录来解决问题。

如果id不按时间顺序排列,并且您可能有重复项,则查询会变得更加困难。没有“先前记录”的定义。 union all是最佳解决方案:

(select t.*
 from t
 where date < '2017-06-09'
 order by date desc
 limit 1
) union all
select t.*
from t
where date > >= '2017-06-09' and
      date <= '2017-06-12'

答案 1 :(得分:0)

我认为这是你正在寻找的。

查询的第一部分与您的相同,第二部分获取您的第一个日期2017-06-09之前的所有值,按date DESC排序,然后将查询限制为仅占据最顶层价值使用LIMIT 1

SELECT
    *
  FROM table
  WHERE `date` BETWEEN '2017-06-09' AND '2017-06-12'
    OR `id` = (
      SELECT
          `id`
        FROM table
        WHERE `date` < '2017-06-09'
        ORDER BY `date` DESC
        LIMIT 1
    )

答案 2 :(得分:0)

如果你正在使用MYSQL,我已经尝试过,它运行良好。

(select * from table where date < '2017-06-09' order by date desc limit 1 ) union (select * from table where date between '2017-06-09' AND '2017-06-12' order by date)

答案 3 :(得分:-1)

  

我希望结果也应该包含一个以前的记录(i-e记录,id = 17以此为例)

如果您知道行是按时间顺序创建的,并且您的ID字段是自动递增的,那么您甚至不需要使用日期字段,因为您可以假设更高的ID表示稍后记录。因此,只需将搜索量限制在您想要的ID上,然后抓两行:

SELECT * FROM TABLE WHERE id <= 17 ORDER BY id DESC LIMIT 2;

这具有完全索引的额外好处,如果在日期字段中引入WHERE子句,则可能不是这种情况。