2012-01-12 54 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