SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.11.2009 17:15:21

apple-way
Участник
Зарегистрирован: 12.11.2009
Сообщений: 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




Подскажите, пожалуйста как написать такой запрос. Я вижу в голове несколько вариантов построения, но даже не буду их описывать из-за неуверенности и отсутствия опыта в таких запросах.

Заранее спасибо.

Неактивен

 

#2 12.11.2009 17:34:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Как сделать выборку одного продукта по сложному условию? Задачка

Самообъединение Вас спасет.

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

Неактивен

 

#3 29.11.2009 10:52:09

maximt
Участник
Зарегистрирован: 29.11.2009
Сообщений: 1

Re: Как сделать выборку одного продукта по сложному условию? Задачка

такая же задача, но условий может быть любое количество.
один продукт и много категорий для него.


делать самообъединение для каждого условия конечно помогает, но интересно можно ли сделать лаконичнее ?

Неактивен

 

#4 01.12.2009 14:59:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Как сделать выборку одного продукта по сложному условию? Задачка

Если категории динамические, то лаконичнее, боюсь, никак не получится.
Если это статический набор категорий — можно сделать таблицу, в которой
будет что-то типа (id, cat1, cat2, … catN), и по ней, соответственно, делать
выборку.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson