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
)
我已经写了三个有效的 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
)