Недавно мне пришлось написать запрос для фильтрации некоторых конкретных данных, который выглядел следующим образом:
Предположим, что у меня есть 3 разных значения, которые я хочу найти в 3 разных полях одной из моих таблиц в моей базе данных, их нужно искать во всех возможных порядках без повторения.
Вот пример (для простоты понимания я буду использовать нотацию именованных запросов, чтобы показать, где должны быть размещены значения):
знач1 = "а", знач2 = "б", знач3 = "с"
Это запрос, который я сгенерировал:
SELECT * FROM table WHERE
(fieldA = :val1 AND fieldB = :val2 AND fieldC = :val3) OR
(fieldA = :val1 AND fieldB = :val3 AND fieldC = :val2) OR
(fieldA = :val2 AND fieldB = :val1 AND fieldC = :val3) OR
(fieldA = :val2 AND fieldB = :val3 AND fieldC = :val1) OR
(fieldA = :val3 AND fieldB = :val1 AND fieldC = :val2) OR
(fieldA = :val3 AND fieldB = :val2 AND fieldC = :val1)
Что мне нужно было сделать, так это сгенерировать запрос, имитирующий перестановку без повторения. Есть ли лучший способ сделать этот тип запроса?
Это нормально для 3x3, но если мне нужно сделать то же самое с чем-то большим, например 9x9, то генерация запроса будет огромным беспорядком.
Я использую MariaDB, но могу принимать ответы, которые могут работать на PostgreSQL. (Я хочу узнать, есть ли умный способ написания запросов такого типа без «грубой силы»)