2012-01-12 35 views
1

我尝试获取日期较低的“n”个条目和日期“高于”一个选定日期的“n”个条目。MySQL:按日期选择前5项和后5项,查询1,不带子查询

实例DB:(由employment_date订购)

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,对于克劳迪娅我想要:sandra,steven,claudia,chuck,bob

当然,我也只是做两个查询,但因为我有停靠到的dataProvider的给定结构我种得做,在一个简单的查询只能使用选择,加入/左连接/内加入,从,在哪里,分组依据,排序和限制。 最好不要子查询。

该ID的方式不是连续的。

任何想法的人?

+1

在你的例子中,这不是'Sandra'而不是'Peter'吗? – bububaba 2012-01-12 10:24:11

+1

哦,我总是混合桑德拉和彼得。他们看起来非常相似; D – 2012-01-12 10:28:16

回答

2

什么丑(AOT好或坏)

(
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日期空间的末尾来杀死较早的日期
  • 然后对早期日期做同样的事
  • 最后根据需要排序
+0

我必须投票回答,因为它真的很好,但正如我所提到的,我必须使用这个给定的结构,这使得UNION解决方案几乎不可能。但是,谢谢! – 2012-01-12 10:31:49

+2

你能编辑你的OQ来阐述什么是和什么不容易/可能使用? – 2012-01-12 10:35:03

+0

好主意。我会照办的。 – 2012-01-12 11:11:49