括号在这个mysql结果中有影响吗?

时间:2010-09-17 01:43:38

标签: sql mysql

我试图运行此查询:

(
    (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

2 个答案:

答案 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无效。你不需要它们。这很微妙,但这就是问题所在。