如何在UNION ALL中使用MySQL UNION

时间:2015-05-13 13:53:22

标签: mysql sql union union-all

我正在尝试执行此查询:

(
SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank
FROM club_offer co
WHERE co.id IN (31, 791, 360, 382)
GROUP BY offerId
UNION
SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank
FROM club_offer co
WHERE co.id IN (869, 376, 201, 1246)
GROUP BY offerId
ORDER BY rank DESC
)
UNION ALL
(
SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank
FROM club_offer co
WHERE co.id IN (117, 168, 193, 204, 330, 377, 378, 379, 380, 381, 452, 931, 980, 1100, 1146, 1147, 1190, 1247)
GROUP BY offerId
ORDER BY rank DESC
)

但我得到错误:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   在'UNION

附近

所以,我猜我要么使用错误的语法,要么我正在尝试做一些无法做到的事情。我想这不需要SQL小提琴,很可能有经验的人会马上看到错误。

有人可以帮忙吗?感谢

2 个答案:

答案 0 :(得分:2)

您的错误来自您的括号。这是重写当前查询的一种方法:

SELECT offerId, title, details, link, reference, rank
FROM
(
   SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank
   FROM club_offer co
   WHERE co.id IN (31, 791, 360, 382)
   UNION
   SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank
   FROM club_offer co
   WHERE co.id IN (869, 376, 201, 1246)
) t
UNION ALL
SELECT co.id as offerId, co.title, co.details, co.link, co.reference, co.rank
FROM club_offer co
WHERE co.id IN (117, 168, 193, 204, 330, 377, 378, 379, 380, 381, 
                452, 931, 980, 1100, 1146, 1147, 1190, 1247)
ORDER BY rank DESC

我也从内部查询中删除了group byorder by子句 - 可以根据需要随意添加,但子查询中的order by将毫无用处。

答案 1 :(得分:0)

您正在以错误的方式使用parentesis:您放入代码的方式似乎是您尝试在选择联合状态之间建立优先顺序,并且语法不允许这样做。但正如一些人对冥想的提及,你可以:

select * from
    (select ... from ...
    union
    select ... from ...) as T1
union all
    select ... from ...

union / union的所有方都是单个查询。

一些小问题:
如果不存在限制条款,则每个选择内的order by都没有意义 并非在所有情况下group by(使用mysql hability错过分组函数)会产生与distinct

相同的结果
相关问题