我有这样的表
+----+----------------------+------------+
| 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以示例为准)
感谢。
答案 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)
我认为这是你正在寻找的。 p>
查询的第一部分与您的相同,第二部分获取您的第一个日期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
子句,则可能不是这种情况。