Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Есть таблица в которой три поля: ПРОДУКТ (ПР), ОПЦИЯ (ОП), ЗНАЧЕНИЕ (ЗН).
Выглядит это примерно так:
ПР | ОП | ЗН
-------------
1 | 1 | 11
1 | 2 | 3
1 | 4 | 23
4 | 1 | 11
4 | 4 | 4
5 | 1 | 10
5 | 3 | 10
2 | 1 | 2
2 | 2 | 3
2 | 3 | 10
2 | 4 | 23
В данном примере есть четыре продукта (1,2,4,5).
Для продукта 1 описано три опции со значениями (1=11, 2=3, 4=23)
Для продукта 2 описано четыре опции со значениями (1=2, 2=3, 3=10, 4=23)
Для продукта 4 описано две опции со значениями (1=11, 4=4)
Для продукта 5 описано две опции со значениями (1=10, 3=10)
Задача в следующем:
В таблице должен остаться только продукт у которого есть
опция 1 равная 11 (1=11)
И
опция 4 равная 23 (4=23)
Эти строки выделены жирным в таблице.
В данном примере под это условие подходит только один продукт - продукт 1.
Потому что у него есть строки и с тем и с другим сочетанием опция=значение.
В примере есть продукт 4, у которого есть опция 1 равная 11, но НЕТ опции 4 равной 23. Этот продукт не должен попасть в выборку. То же самое с продуктом 5.
Пример НЕПРАВИЛЬНОГО условия:
WHERE (ОП=1 AND ЗН=11) И (ОП=4 AND ЗН=23) GROUP BY productID
Этот вариант не выведет ни одной записи, потому что не может быть строк где опция одновременно равна и 1 и 4.
WHERE (ОП=1 AND ЗН=11) ИЛИ (ОП=4 AND ЗН=23) GROUP BY productID
В этом случае в таблице останется не только продукт 1, но и продукт 4 и 5
Подскажите, пожалуйста как написать такой запрос. Я вижу в голове несколько вариантов построения, но даже не буду их описывать из-за неуверенности и отсутствия опыта в таких запросах.
Заранее спасибо.
Неактивен
Самообъединение Вас спасет.
SELECT a.product
FROM tablename a
JOIN tablename b ON a.product = b.product
WHERE a.option = 1 AND a.value = 11 AND b.option = 4 AND b.value = 23
Неактивен
такая же задача, но условий может быть любое количество.
один продукт и много категорий для него.
делать самообъединение для каждого условия конечно помогает, но интересно можно ли сделать лаконичнее ?
Неактивен
Если категории динамические, то лаконичнее, боюсь, никак не получится.
Если это статический набор категорий — можно сделать таблицу, в которой
будет что-то типа (id, cat1, cat2, … catN), и по ней, соответственно, делать
выборку.
Неактивен
Страниц: 1