2012-01-12 4 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, для claudia я бы хотел: sandra, steven, claudia, патрон, боб.

Конечно я мог бы просто сделать два запроса, но так как я должен состыковаться в данной структуру dataproviders я вроде должен сделать это в один простом запросе, который может использовать только Select, Join/Left Join/Inner Join, From, Where, Group By, Order By and Limit. Предпочтительно без подзапросов.

Иди, кстати, не смежны.

Любые идеи кто-нибудь?

+1

Не будет ли это «Сандра» вместо «Питера» в вашем примере? – bububaba

+1

О, я всегда смешиваю сандру и пэтер. они так похожи, D –

ответ

2

насчет уродливого (АОТ хорошо или плохо)

(
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 практически невозможным. Но спасибо! –

+2

Не могли бы вы отредактировать свой OQ, чтобы выяснить, что и что нелегко/возможно использовать? –

+0

Хорошая идея. Я сделаю так. –

Смежные вопросы