Должен быть лучший способ написания этого запроса.
Я хочу выбрать все данные между парой дат. В идеале первая и последняя строки набора результатов должны быть такими, которые указаны в предложении WHERE. Если эти строки не существуют, я хочу, чтобы строки предшествовали и следовали запрошенному диапазону.
Пример:
Если мои данные:
...
135321, 20090311 10:15:00
135321, 20090311 10:45:00
135321, 20090311 11:00:00
135321, 20090311 11:15:00
135321, 20090311 11:30:00
135321, 20090311 12:30:00
...
И запрос:
SELECT *
FROM data_bahf
WHERE param_id = 135321
AND datetime >= '20090311 10:30:00'
AND datetime <= '20090311 12:00:00'
Я хочу, чтобы возвращаемые данные включали строку в 10:15 и строку в 12:30. Не только те, которые строго соответствуют предложению WHERE.
Это лучшее, что я придумал.
SELECT * FROM (
SELECT *
FROM data_bahf
WHERE param_id = 135321
AND datetime > '20090311 10:30:00'
AND datetime < '20090311 12:00:00'
UNION
(
SELECT * FROM data_bahf
WHERE param_id = 135321
AND datetime <= '20090311 10:30:00'
ORDER BY datetime desc
LIMIT 1
)
UNION
(
SELECT * FROM data_bahf
WHERE param_id = 135321
AND datetime >= '20090311 12:00:00'
ORDER BY datetime asc
LIMIT 1
)
)
AS A
ORDER BY datetime
(пока игнорируйте использование SELECT *)
EDIT:
У меня есть индексы для param_id, datetime и (param_id, datetime)