mysql 联合语句因括号放置而失败?

mysql union statement failing because of bracket placement?

我已经写了三个有效的 sql 语句,并且正在尝试使用这样的联合:

(SELECT * FROM articles WHERE date <= '2015-01-15' AND category='News' )
UNION
(SELECT * FROM articles WHERE date <= '2015-01-15' AND subcategory='News')
ORDER BY date DESC LIMIT 5
UNION
SELECT * FROM articles WHERE Month(recurring) = '01' AND category='News' ORDER BY 
recurring DESC LIMIT 5

我要问的是基本结构:两个初始查询合并并按日期排序。 然后是第三个查询,按单独的列排序,然后合并到前两个中。

当我分别对括号内的前 2 个查询进行排序时,上面的查询似乎工作正常,但是当我将其从括号中取出并一起排序时失败。

按单独的列排序是否导致排序失败?我尝试添加一组额外的括号来封装前 2 个语句和排序顺序,但没有成功。 这是错误代码:

您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 'UNION SELECT * FROM articles WHERE Month(recurring) = '01' AND category='News' 附近使用的正确语法2

您的查询存在一些问题。一个 UNION 查询只能有一个 LIMIT 子句和一个 ORDER BY 子句,并且都应用于整个结果。

如果我正确理解了您的逻辑,我会将您的查询重写为:

(
  SELECT * FROM articles
  WHERE date <= '2015-01-15' AND (category='News' OR subcategory='News')
  ORDER BY date DESC
  LIMIT 5
)
UNION
(
  SELECT * FROM articles
  WHERE Month(recurring) = '01' AND category='News'
  ORDER BY recurring DESC
  LIMIT 5
)

如果您的查询比较复杂,并且您确实希望将前两个查询分开,那么使用正确的语法是:

SELECT * FROM (
    SELECT * FROM articles WHERE date <= '2015-01-15' AND category='News'
    UNION
    SELECT * FROM articles WHERE date <= '2015-01-15' AND subcategory='News'
    ORDER BY date DESC
    LIMIT 5
) AS s
UNION
(
  SELECT * FROM articles
  WHERE Month(recurring) = '01' AND category='News'
  ORDER BY recurring DESC
  LIMIT 5
)