如何在 UNION ALL 中使用 MySQL UNION

How to use MySQL UNION inside 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
)

但我得到错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION

所以,我想要么我使用了错误的语法,要么我正在尝试做一些无法完成的事情。我想这不需要 SQL fiddle,很有可能有经验的人会马上看出问题所在。

有人可以帮忙吗?谢谢

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

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 将是没用。

您以错误的方式使用了括号:您在代码中输入的方式似乎是您试图在 selects 联合统计之间建立优先顺序,而语法不允许这样做。但正如有人在评论中提到的那样,您可以:

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

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

一些小问题:
如果没有 limit 子句,每个 select 中的 order by 没有任何意义。
并非在所有情况下 group by(使用 mysql 错过分组函数的能力)产生与 distinct

相同的结果