Какой приоритет у OR?

Ссылка скопирована
1 ответ

Какой приоритет у оператора OR? Если я делаю выборку из таблицы и мне нужен нужно например в приоритете найти по ID, а после, если не найдено то по CODE: `id` = value OR `code` = value. Что он будет искать в приоритете, если есть и то, и то?

Дополнительно:

Если не знаете приоритет - то всегда можно поставить скобки. Это решает проблемы и не несет накладных расходов.
Просто код становится на 2 символа длиннее.

SELECT ..... FROM .... WHERE (CODE: `id` = value OR `code` = value) .... other predicates....

SELECT ..... FROM .... WHERE (CODE: `id` = value OR `code` = value) .... other predicates....

Update:

Если тебе надо гарантировать что поле не пустое - то добавь еще один предикат IS NOT NULL.

  • Dr. Bacon, в таком кейсе я думаю что 99% будет отдано на откуп оптимизатору. Например если одно из полей имеет индекс - тогда направление поиска будет перевернуто. Другое дело, понимает ли автор булеву логику настолько чтобы понять что вопрос не имеет резона.
  • mayton2019, т.е. грубо говоря, мне вопрос решить проще будет двумя запросами? Первым проверить code = :value, если ничего не найдено, то вызывать второй id = :value?
  • Little_Junior, а с точки зрения булевой логики, разве результат не будет одинаков?
  • mayton2019, не должен, потому что у меня в задаче в приоритете получить данные через code, а уже если их нет, то забирать из ID, потому что он есть точно. Эти два поля вместе с собой никак не связаны
  • Little_Junior, а между первым и вторым поиском пользователь делает какие-то действия?
  • mayton2019, нет, не делает. Это выборка из доступных ему сервисов, где code - системные, а с id пользовательские
  • Little_Junior, вот и делай как я говорю. Без этих промежуточных выборок. Если тебе надо гарантировать что поле не пустое - то добавь еще один предикат IS NOT NULL.
  • mayton2019, да, слушай, я разобрался, да. Спасибо тебе большое, напиши свой комментарий ответом, я его помечу решением
  • Little_Junior, добавил.

Ответы:

SELECT IF (i.id = :value , 1, 0) as _order_rank, i.* FROM `items` i WHERE i.id = 100 or i.code = 'T1000' ORDER by _order_rank DESC

SELECT IF (i.id = :value , 1, 0) as _order_rank, i.* FROM `items` i WHERE i.id = 100 or i.code = 'T1000' ORDER by _order_rank DESC

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ольга Сеть Ответ

При использовании оператора OR в выражениях в PHP, приоритет у него ниже, чем у оператора AND. Это означает, что оператор OR будет выполняться после оператора AND, если они оба присутствуют в одном выражении.

Для лучшего понимания приоритетов операторов в PHP, можно использовать скобки для явного указания порядка операций. Например, если у вас есть выражение с операторами AND и OR, и вы хотите, чтобы OR выполнялся первым, вы можете использовать скобки для явного указания порядка:

$result = $a || $b && $c;

$result = $a || $b && $c;

В этом примере, оператор AND имеет более высокий приоритет, чем оператор OR, поэтому сначала будет выполнено выражение $b && $c, а затем результат будет объединен с $a с использованием оператора OR.

Если вы хотите изменить порядок операций и сначала выполнить оператор OR, то нужно использовать скобки:

$result = ($a || $b) && $c;

$result = ($a || $b) && $c;

Теперь оператор OR будет выполнен первым, а затем результат будет объединен с $c с использованием оператора AND.

Помните, что использование скобок для явного указания порядка операций делает ваш код более понятным и предсказуемым для других разработчиков, которые могут работать с вашим кодом.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно