Оператор sql:
SELECT * FROM support_chat WHERE (`from`=? AND `to`=?) OR (`from`=? AND `to`=?);
Или есть альтернатива этому оператору sql? И действителен ли этот оператор sql (я думаю, что да, но, пожалуйста, скажите мне)?
На всякий случай:
Моя версия MySQL — 8.0.22 (установлена с https://dev.mysql.com/downloads, исходный дистрибутив с Boost для Linux)
Позвольте мне использовать литеральные значения, а не параметры, чтобы синтаксис был более понятным. Вы, кажется, хотите:
where (`from` = 1 AND `to` = 2) OR (`from` = 2 AND `to` = 1)
Это работает и (вероятно!) делает то, что вы хотите. Вы также можете сформулировать равенство логического кортежа, что сокращает условие:
where (`from`, `to`) in ((1, 2), (2, 1))
Это, вероятно, будет более эффективным, чем ваш исходный код, особенно если у вас есть индекс на (from, to)
.
Или, если вы не хотите повторять параметры:
where (1, 2) in ((`from`, `to`), (`to`, `from`))
Альтернативно используются least()
и greatest()
:
where least(`from`, `to`) = 1 and greatest(`from`, `to`) = 2
Это позволит использовать индекс выражений, который поддерживается в самых последних версиях MySQL:
create index idx_support_chat on support_chat((least(`from`, `to`)), (greatest(`from`, `to`)));
действительно ли where (`from` = 1 AND `to` = 2) OR (`from` = 2 AND `to` = 1)
прежде всего? Конечно?
У меня есть знания SQL, но я хочу быть осторожным с некоторыми вещами.
Действительно ли where (`from` = 1 AND `to` = 2) OR (`from` = 2 AND `to` = 1)
действительно в первую очередь?
@WebTestingRL Если он недействителен, это вызовет синтаксическую ошибку. Правильно это или нет, зависит от того, соответствует ли логика вашим целям.
@ ÁlvaroGonzález Уф, это развеивает мое странное ощущение, что что-то может быть не так
Конструкторы строк не оптимизировались до версии 5.7.3. До этого индекс не использовался. Пример с LEAST()
не подлежит анализу, поэтому потребуется сканирование таблицы, если у вас нет достаточно новой версии для обработки «функциональных» индексов.
Это тест про неупорядоченную пару? То есть всегда ли
from
иto
меняются местами во второй части запроса?