Я пытался запустить этот запрос:
(
(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 just because of the prepared statements
На самом деле вам не нужны скобки:
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, как и предложение ORDER BY.
Я предполагаю, что это примерные запросы, так как ваши операторы SELECT
не только избыточны, но и плохо сформированы.
Однако, чтобы ответить на ваш исходный вопрос, добавление скобок создает выражение, которое изменяет порядок операций. Как и в математике. Таким образом, результат выражения в вашем первом примере не поддерживает предложение LIMIT. Однако второй, с выражением UNION
, делает.
Короче говоря, круглые скобки делают это другим выражением и недействительны LIMIT
. Вы им не нужны. Это тонко, но эта проблема.