Является ли это допустимым заявлением sql? Или есть лучшая альтернатива для этого?

Оператор 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)

Это тест про неупорядоченную пару? То есть всегда ли from и to меняются местами во второй части запроса?

Rick James 11.12.2020 17:50
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Позвольте мне использовать литеральные значения, а не параметры, чтобы синтаксис был более понятным. Вы, кажется, хотите:

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) прежде всего? Конечно?

user10201814 11.12.2020 11:10

У меня есть знания SQL, но я хочу быть осторожным с некоторыми вещами.

user10201814 11.12.2020 11:12

Действительно ли where (`from` = 1 AND `to` = 2) OR (`from` = 2 AND `to` = 1) действительно в первую очередь?

user10201814 11.12.2020 11:12

@WebTestingRL Если он недействителен, это вызовет синтаксическую ошибку. Правильно это или нет, зависит от того, соответствует ли логика вашим целям.

Álvaro González 11.12.2020 11:13

@ ÁlvaroGonzález Уф, это развеивает мое странное ощущение, что что-то может быть не так

user10201814 11.12.2020 11:14

Конструкторы строк не оптимизировались до версии 5.7.3. До этого индекс не использовался. Пример с LEAST() не подлежит анализу, поэтому потребуется сканирование таблицы, если у вас нет достаточно новой версии для обработки «функциональных» индексов.

Rick James 11.12.2020 17:45

Другие вопросы по теме