如何在 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 by
和 order 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
相同的结果
我正在尝试执行此查询:
(
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 by
和 order 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