влияет ли скобки на результаты MySQL?

0

Я пытался запустить этот запрос:

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

Теги:

2 ответа

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, как и предложение ORDER BY.

  • 0
    Что делать, если я использую ORDER BY в каждом из выборов? я просто попробовал это здесь и не было ошибок ...
  • 0
    @hugo_leonardo: MySQL поддерживает ORDER BY (и LIMIT) в каждом UNION, пока он находится в квадратных скобках, и содержит запрос, который является частью UNION. Я не знаю других БД, которые позволяют это.
Показать ещё 1 комментарий
1

Я предполагаю, что это примерные запросы, так как ваши операторы SELECT не только избыточны, но и плохо сформированы.

Однако, чтобы ответить на ваш исходный вопрос, добавление скобок создает выражение, которое изменяет порядок операций. Как и в математике. Таким образом, результат выражения в вашем первом примере не поддерживает предложение LIMIT. Однако второй, с выражением UNION, делает.

Короче говоря, круглые скобки делают это другим выражением и недействительны LIMIT. Вы им не нужны. Это тонко, но эта проблема.

  • 0
    да, это пример запроса: p
  • 0
    Я полагал. Право на ;)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню