@IdFox

Как сделать SQL выборку по нескольким параметрам?

Всем привет, такой вопрос возник
Как произвести выборку по нескольким параметрам
Объясню на примере

Есть например табличка markers параметров заказа

id order_id m_id
1|5|10
4|5|30
6|8|10
5|8|20
13|8|30
7|9|10
8|9|20
9|15|10
10|15|20
11|17|10
12|17|20
14|17|30
3|20|30

Где order_id - номер заказа, m_id - ID параметра
Например заказ №5 имеет параметры (ID параметра) 10 и 30, 17 - 10, 20, 30 ну и т.д
Как выбрать заказы, которые имеют все заданные параметры
Т.е приведу частные примеры

Один параметр поиска - m_id=10
SELECT t1.order_id FROM `markers` AS t1 WHERE t1.m_id=10
Получили заказы 5, 8, 9, 15, 17

Два параметра поиска
SELECT t1.order_id FROM `markers` AS t1, `markers` AS t2 WHERE t1.order_id = t2.order_id AND t1.m_id=10 AND t2.m_id=20
Получили заказы 8, 9, 15, 17

Три параметра поиска
SELECT t1.order_id FROM `markers` AS t1, `markers` AS t2, `markers` AS t3 WHERE t1.order_id = t2.order_id AND t2.order_id = t3.order_id AND t1.m_id=10 AND t2.m_id=20 AND t3.m_id=30
Получили заказы 8, 17

Можно ли как либо составить общий запрос, или может оптимизировать текущий
Потому как если нужен например поиск по 10 или 20 параметрам сразу - SQL запрос вырастает в лестницу...
Да и не знаю как это отражается на памяти потребляемой и скорости выполнения выборки
Можете подсказать как оптимальнее решить данную задачу, может хранить номера заказов и параметры заказа не в одной табличке, а нескольких
Главная суть - один заказ может иметь несколько параметров (число параметров само не ограничено, но заказ имеет ограниченное число этих параметров)
И нужно сделать выборку всех заказов, которые имеют все указанные в поиске параметры
Всем спасибо за внимание )
  • Вопрос задан
  • 9296 просмотров
Решения вопроса 1
SELECT order_id, COUNT(*) as cnt
FROM markers
WHERE m_id IN (10, 20, 30)
GROUP BY order_id
HAVING cnt=3 -- тут количество искомых параметров 10, 20, 30
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AdvanTiSS
SELECT order_id, Count(m_id) FROM markers
WHERE m_id IN (2,3,5,10) -- перечисляем все искомые параметры
GROUP BY order_id
HAVING Count(m_id) = len('2,3,5,10') - len(replace('2,3,5,10' , ',' , '' )) + 1 -- вычисляем количество искомых параметров по количеству запятых в строке, либо задаем уже рассчитанное значение
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы