MySQL:按日期选择前 5 个和后 5 个条目,1 个查询,没有子查询

Posted

技术标签:

【中文标题】MySQL:按日期选择前 5 个和后 5 个条目,1 个查询,没有子查询【英文标题】:MySQL: Select prior 5 and following 5 entries by date, 1 query, without subqueries 【发布时间】:2012-01-12 10:06:37 【问题描述】:

我尝试获取“n”个日期低于某个选定日期的条目和“n”个日期“高于”一个选定日期的条目。

示例数据库:(按就业日期排序)

id  | employment_date | name
-------------------------------
23  | 1980-01-11      | peter
21  | 1980-09-02      | sandra
34  | 1982-04-12      | steven
4   | 1982-06-14      | claudia
45  | 1983-10-12      | chuck
56  | 1984-03-16      | bob
1   | 1987-03-23      | kevin

所以我想要显示克劳迪娅,然后显示在她之前就业的“n”个人和在她之后就业的“n”个人。 “n”为 2,对于 claudia,我想要:sandra,steven,claudia,chuck,bob

当然我可以只做两个查询,但由于我必须对接给定的数据提供者结构,我不得不在一个简单的查询中完成,只能使用 Select, Join/Left Join/Inner Join、From、Where、Group By、Order By和Limit。 最好没有子查询。

顺便说一下,id 不是连续的。

有什么想法吗?

【问题讨论】:

在你的例子中不是Sandra而不是Peter吗? 哦,我总是把 sandra 和 peter 混在一起。他们长得很像;D 【参考方案1】:

丑的呢(a.o.t. 好坏)

(
SELECT id,@basedate:=employment_date AS employment_date,name
FROM employees WHERE name='claudia'
)
UNION
(
SELECT * FROM employees
ORDER BY if (employment_date>@basedate,employment_date,'9999-12-31') ASC
LIMIT 2
)
UNION
(
SELECT * FROM employees
ORDER BY if (employment_date<@basedate,employment_date,'0001-01-01') DESC
LIMIT 2
)
ORDER BY employment_date ASC

思路分解:

首先选择基行,记住日期 然后(使用记住的基础)选择较晚的日期,通过将较早的日期设置为 mysql 日期空间的末尾来杀死较早的日期 然后对较早的日期执行相同的操作 最后根据需要排序

【讨论】:

我必须对答案投赞成票,因为它真的非常好,但正如我所提到的,我必须使用这个给定的结构,这使得 UNION 解决方案几乎不可能。不过谢谢! 您能否编辑您的 OQ 以详细说明哪些是以及哪些不容易/可能使用?

以上是关于MySQL:按日期选择前 5 个和后 5 个条目,1 个查询,没有子查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 从 7 天前选择行

在 CodeIgniter 中按日期过滤 MySQL 条目

在单个查询中选择两个特定的 mysql 表行

KendoUI Grid:自定义编辑表单,日期选择器返回错误格式

MySQL 分区:按 ID 选择,但按日期删除

冒泡排序