我试图运行此查询:
(
(SELECT * FROM (SELECT * FROM `users` WHERE `access_level` > 0) AS `search_subject` WHERE (BINARY `username` = ?))
UNION
(SELECT * FROM (SELECT * FROM `users` WHERE `access_level` > 0) AS `search_subject` WHERE (BINARY `username` = ?))
)
LIMIT 5
但由于周围的括号,在LIMIT 5
之前出现错误。 obs: the query is all in a row, i endented it here for better reading. is it allowed in sql?
以下工作正常:
(SELECT * FROM (SELECT * FROM `users` WHERE `access_level` > 0) AS `search_subject` WHERE (BINARY `username` = ?))
UNION
(SELECT * FROM (SELECT * FROM `users` WHERE `access_level` > 0) AS `search_subject` WHERE (BINARY `username` = ?))
LIMIT 5
我的问题是:第二个版本相当于第一个版本,还是第二个版本中的LIMIT仅适用于第二个SELECT
?如果是这样,我该怎么做才能解决这个问题呢?谢谢(:
ps: don't worry about the interrogation marks. that's just because of the prepared statements
答案 0 :(得分:2)
实际上,您不需要括号:
SELECT *
FROM `users`
WHERE `access_level` > 0
AND BINARY `username` = ?
UNION
SELECT *
FROM `users`
WHERE `access_level` > 0
AND BINARY `username` = ?
LIMIT 5
UNION的任何一方都没有区别,因此没有必要。
不,LIMIT适用于所有UNION'd查询的结果,ORDER BY子句也是如此。
答案 1 :(得分:1)
我假设这些是示例查询,因为您的SELECT
语句不仅冗余而且格式不正确。
但是,要回答原始问题,添加括号会创建一个更改操作顺序的表达式。就像在数学中一样。因此,第一个示例中的表达式结果不支持LIMIT子句。但是,第二个,UNION
语句,确实如此。
长话短说,括号使它成为不同的陈述并使LIMIT
无效。你不需要它们。这很微妙,但这就是问题所在。