用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对照三个单独查询的并集检查更新的查询。您能帮助我理解查询吗。