Какой приоритет у OR?
Какой приоритет у оператора 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
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
При использовании оператора OR в выражениях в PHP, приоритет у него ниже, чем у оператора AND. Это означает, что оператор OR будет выполняться после оператора AND, если они оба присутствуют в одном выражении.
Для лучшего понимания приоритетов операторов в PHP, можно использовать скобки для явного указания порядка операций. Например, если у вас есть выражение с операторами AND и OR, и вы хотите, чтобы OR выполнялся первым, вы можете использовать скобки для явного указания порядка:
$result = $a || $b && $c;
В этом примере, оператор AND имеет более высокий приоритет, чем оператор OR, поэтому сначала будет выполнено выражение $b && $c, а затем результат будет объединен с $a с использованием оператора OR.
Если вы хотите изменить порядок операций и сначала выполнить оператор OR, то нужно использовать скобки:
$result = ($a || $b) && $c;
Теперь оператор OR будет выполнен первым, а затем результат будет объединен с $c с использованием оператора AND.
Помните, что использование скобок для явного указания порядка операций делает ваш код более понятным и предсказуемым для других разработчиков, которые могут работать с вашим кодом.