MySQL UNION ALL 语法错误

MySQL Syntax error in UNION ALL

我有一个使用多个 UNION ALL 的查询。我遇到语法错误,但找不到它。我认为这与使用多个联合有关。我只使用 MySQL。感谢任何帮助。

ERROR 1064 (42000):您的 SQL 语法有误;查看与您的 MySQL 服务器版本相对应的手册,了解在第 41

行 'ALL(SELECT a.' 附近使用的正确语法
 SELECT   Sum(counter)                           AS counter,
         DATE_FORMAT(dtime,'%Y-%m-%d 00:00:00') AS dtime
FROM     (
                SELECT counter,
                       dtime
                FROM   MinutesVisible
                WHERE  dtime >= '2015:3:1 00:00:00'
                AND    dtime <= '2015:3:16  23:59:59'
                AND    dtime < NOW()
                AND    id='980371'
                AND    counter != 0
                UNION ALL 
                          (
                                 SELECT a.counter,
                                        a.dtime
                                 FROM   MinutesVisible a,
                                        calendar b
                                 WHERE  a.dtime = b.dtime
                                 AND    b.dtime >= '2015:3:1 00:00:00'
                                 AND    b.dtime <= '2015:3:16  23:59:59'
                                 AND    b.dtime < NOW()
                                 AND    id='979661')
                   UNION
                            (
                                   SELECT '0'  AS counter,
                                          b.dtime
                                   FROM   calendar b
                                   WHERE  dtime >= '2015:3:1  00:00:00'
                                   AND    dtime <= '2015:3:16  23:59:59'
                                   AND    dtime < NOW()
                                   AND    dtime NOT IN
                                          (
                                                 SELECT dtime
                                                 FROM   MinutesVisible
                                                 WHERE  dtime >= '2015:3:1 00:00:00'
                                                 AND    dtime <= '2015:3:16 23:59:59'
                                                 AND    dtime < NOW()
                                                 AND    id='979661' ))
                   ORDER BY dtime
                   AND      counter != 0
                   UNION ALL (this is line 41)
                             (
                                    SELECT a.counter,
                                           a.dtime
                                    FROM   MinutesVisible a,
                                           calendar b
                                    WHERE  a.dtime = b.dtime
                                    AND    b.dtime >= '2015:3:1 00:00:00'
                                    AND    b.dtime <= '2015:3:16  23:59:59'
                                    AND    b.dtime < NOW()
                                    AND    id='984121')
                      UNION
                               (
                                      SELECT '0' AS counter,
                                             b.dtime
                                      FROM   calendar b
                                      WHERE  dtime >= '2015:3:1  00:00:00'
                                      AND    dtime <= '2015:3:16  23:59:59'
                                      AND    dtime < NOW()
                                      AND    dtime NOT IN
                                             (
                                                    SELECT dtime
                                                    FROM   MinutesVisible where dtime >= '2015:3:1 00:00:00'
                                                    AND    dtime <= '2015:3:16 23:59:59'
                                                    AND    dtime < NOW()
                                                    AND    id='984121' ))
                      ORDER BY dtime
                      AND      counter != 0) AS MainTable
GROUP BY WEEKOFYEAR(dtime)
HAVING   SUM(counter) > 0

如果我将 'id=' 更改为 id in 并在其中包含另一个 id 号,然后删除第二个联合,一切正常。我很确定这与 second union all 有关系。该语句是动态构建的,因此我不能轻易更改为使用 in 而不是 multiple union alls。

如果我没有解释清楚,请告诉我,我会提供更多细节。

检查您所写行上方的语句(这是第 41 行) 尝试 remove/update 此语句并执行您的查询。

ORDER BY
            dtime
        AND counter != 0

我们不能在 UNION 和 UNION ALL 之间使用顺序。 order by 应该在最后,毕竟 UNION / UNION ALL statements