必须有更好的方法来编写此查询。
我想选择一对日期之间的所有数据。理想情况下,结果集的第一行和最后一行将是 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 * 的使用)
编辑:我在 param_id、datetime 和 (param_id, datetime) 上有索引