Выборка товара с такими же характеристиками.. чё то туплю.

Kelkos

Сам себе программер
Выборка товара с такими же характеристиками.. чё то туплю.

Всем хай.
Что то никак в понедельнег немогу догнать, как сделать такое. Есть таблица товаров, таблица характеристик и связывающая их таблица.
т.е.
таблица goods:
id name

таблица характеристик
goods_chars
id name

таблица связей между товарами и характеристиками.
chars_to_goods
goods_id goods_chars_id

Вот нужно выбрать все товары имеющие ТОЛЬКО определённый набор характеристик.. , например, только с характеристиками goods_chars_id = 1, 2, 3. Последовательность может быть любая. 2, 1, 3 и т.д.
Мндя.. толи простуда сказывается.. тли ещё чего.. но что то ничего не могу придумать.
 

Kelkos

Сам себе программер
bgm
да как сказать.. возможно решение и в IN, но не в "чистом" виде.
Если я задам WHERE goods_chars.id IN (1,2,3) то получу и те товары, где присутвует хоть одна из перечисленных характеристик, а нужно получить только товары с аналогичными характеристиками.
 

Kelkos

Сам себе программер
Анекдот вспомнился.
Сидит чукча на берегу моря. Вдруг всплывает американская подводная лодка. С подлодки на ломанном русском спрашивают чукчу:
- русских видел?
- да.
- куда поплыли?
- на северо-восток.
Подлодка скоренько сматывается в указанном направлении.
Через полчаса всплывает русская подлодка. С подложки чукчу спрашивают:
- американцы были?
- ага.
- куда поплыли?
- на северо-восток.
- ты чукча не мудри.. ты пальцем покажи...

хех. сорри за оффтопик, но что то мыслей оператор HAVING не породил никаких. Может я чего то недогоняю?
 

bgm

 
Ну разве что за старый анекдот:
PHP:
SELECT
    goods_id
FROM
    chars_to_goods
WHERE
    goods_chars_id IN (2,3,1)
GROUP BY
    goods_id
HAVING
    COUNT(goods_id)=3
Так понятнее? :)
 

Kelkos

Сам себе программер
интересная мысль.. надо попробывать..
~~~~~~
ага. спасибо.
а ларчик просто открывался.

-~{}~ 21.08.06 17:41:

хех.. а вот не всё так просто.
Проблема с обной стороны решилась. а с другой...
Если выбрать товары с goods_chars_id IN (2,3), то выберутся также товары и характермстиками 2,3,1 2,4,3 и т.д (т.е. выбираются все товары в числе характеристик которых имееются требуемые)... Вот это то обойти непонятно как вообще. Помоему придётся делать ааагромный кастыль и результат проверять по 2 раза. Первый раз выборка по указанному алгоритму, второй пробегаемся по полученному резальтату и получаем на каждый товар ВСЕ характеристики и сравниваем с "эталоном". ээх. Или всё-таки есть "человеческое" решение?
 

Kelkos

Сам себе программер
Автор оригинала: bgm
Kelkos
Пример своего запроса в студию!
Ты не поверишь, но твой запрос - это и есть то. на чём я отлаживаю.

вот попробуй сам прогони его на таких данных
таблица:
chars_to_goods
goods_id; goods_chars_id
1;1
1;2
2;1
2;2
2;3
3;2
3;4
3;1

Попробуй сделать выборку по goods_chars_id IN (1,2) и всё поймёшь. Выберутся все goods_id, т.к. характеристики 1 и 2 присутствуют во всех товарах, а по идее нужно было бы только goods_id=1 получить.
 

chira

Новичок
a tak:
Код:
SELECT  goods_id
FROM  chars_to_goods
GROUP BY goods_id
HAVING AVG(goods_chars_id IN (2,3,1))=1 AND count(DISTINCT goods_chars_id)=3
-~{}~ 21.08.06 18:47:

возможно хватит одного AVG
 
Сверху