用UNION优化mysql查询
我有一个得到下一个日期和前一个日期的要求 表结构如下所示用UNION优化mysql查询,mysql,Mysql,我有一个得到下一个日期和前一个日期的要求 表结构如下所示 | auto_id | id | next_date | next_activity | | 1 | 1 | 22-12-2012 | - | | 2 | 1 | 25-12-2012 | - | | 3 | 1 | 26-12-2012 | - | | 4 | 1 | 28-12-2012 | -
| auto_id | id | next_date | next_activity |
| 1 | 1 | 22-12-2012 | - |
| 2 | 1 | 25-12-2012 | - |
| 3 | 1 | 26-12-2012 | - |
| 4 | 1 | 28-12-2012 | - |
所以我需要下一天和前一天
下一天=当天之后的下一天
前一天=当前日期之前的下一天
(SELECT * FROM `activity` WHERE id = 1 and next_date > CURDATE() order by next_date asc limit 1)
UNION
(SELECT * FROM `activity` WHERE id = 1 and next_date = CURDATE() )
UNION
(SELECT * FROM `activity` WHERE id = 1 and next_date < CURDATE() order by next_date desc limit 1)
ORDER BY next_date desc limit 2
另一种方法是自动加入表
有没有一种方法可以优化表格还有另一种方法:
SELECT next_date, date_diff
FROM (SELECT *,
@dateDiff := datediff(next_date, curdate()) AS date_diff,
@pDateDiff :=
IF((@dateDiff < 0 AND @dateDiff > @pDateDiff),
@dateDiff,
@pDateDiff)
AS pDateDiff,
@nDateDiff :=
IF((@dateDiff > 0 AND @dateDiff < @nDateDiff),
@dateDiff,
@nDateDiff)
AS nDateDiff
FROM activity, (SELECT @pDateDiff := -9999, @nDateDiff := 9999) tmp
WHERE id = 1) aView
WHERE date_diff IN (@pDateDiff, 0, @nDateDiff)
ORDER BY next_date;
date_diff值给出上一个日期和下一个日期的透视图
选择id=1的所有日期
查找next_date和curdate之间的日期差,并将其存储在用户定义的变量@dateDiff中。
@pDateDiff是另一个变量,它跟踪上一个日期的@dateDiff负值中的最大值
@nDateDiff是另一个变量,它跟踪下一个日期的@dateDiff正值中的最小值
最后,仅选择-ve max、0、+ve min中的日期。
PS:如果您有重复的日期条目,则查询可能会返回所有条目。当差异不总是1时,问题就会出现。。。因此,如果上一个日期是9天前,下一个日期分别是1,2天,我们就没有正确的边界。@Masade好的,请使用Explain对照三个单独查询的并集检查更新的查询。您能帮助我理解查询吗。