Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка товара пренадлежащего нескольким категориям / 19 сообщений из 19, страница 1 из 1
14.08.2013, 21:19:16
    #38366820
sillexo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
Доброе время суток, форумчане.

У меня возникла проблема:
Мне нужно из бд вытянуть товары, которые соответствуют ВСЕМ выбранным категориям, я делаю так:

Код: sql
1.
2.
3.
4.
SELECT p.product_id, p.image, p.price, p.name, p.description 
FROM product p 
LEFT JOIN category cat ON (p.product_id = cat.product_id) 
WHERE cat.category_id IN (114, 119, 125, ... n)



но при этом выводятся товары, в которых встречается хотя бы одна из перечисленных категорий...

Подскажите... проект горит...

Заранее спасибо...
...
Рейтинг: 0 / 0
14.08.2013, 21:20:26
    #38366821
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
sillexo,

Гуглите "реляционное деление"
...
Рейтинг: 0 / 0
14.08.2013, 21:29:25
    #38366833
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
Код: sql
1.
2.
3.
4.
SELECT p.product_id, p.image, p.price, p.name, p.description 
FROM product p 
JOIN (SELECT product_id FROM category WHERE category_id IN (101, 102, 103, 104) GROUP BY product_id HAVING COUNT(*)=4) cat
  ON p.product_id = cat.product_id
...
Рейтинг: 0 / 0
14.08.2013, 21:44:50
    #38366848
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
miksoft,

having count( DISTINCT PRODUCT )=4
...
Рейтинг: 0 / 0
14.08.2013, 21:46:40
    #38366849
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
конечно жк, distinct category_id, не туда посмотрел
...
Рейтинг: 0 / 0
14.08.2013, 21:48:42
    #38366853
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
Cygapb-007,

С чего это Product -то? Тогда уж category надо distinct -ом до 4-х считать... только, насколько понимаю это излишне и так.
...
Рейтинг: 0 / 0
14.08.2013, 21:51:08
    #38366856
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
Cygapb-007miksoft,

having count( DISTINCT PRODUCT )=4а откуда там дублям взяться?
...
Рейтинг: 0 / 0
14.08.2013, 21:54:10
    #38366859
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
Ну обшибся чуток, - так уже исправился... :)
...
Рейтинг: 0 / 0
14.08.2013, 21:56:02
    #38366861
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
Arhat109,

не, необходимо, если речь идет о наличии всех категорий - как раз операция реляционного деления, что и треьуется в старттопике
...
Рейтинг: 0 / 0
14.08.2013, 22:39:03
    #38366899
sillexo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
Спасибо, друзья. Буду пробовать.
...
Рейтинг: 0 / 0
17.08.2013, 14:29:50
    #38369716
sillexo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
Спасибо всем ответившим, у меня все получилось, но возник другой вопрос:

теперь приходит массив

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
[category_id] => Array
        (
            ['116'] => Array
                (
                    [0] => 113
                )

            ['117'] => Array
                (
                    [0] => 119
                    [1] => 122
                )

            ['123'] => Array
                (
                    [0] => 124
                    [1] => 123
                )

        )



Код: sql
1.
2.
3.
4.
SELECT p.product_id, p.image, p.price, p.name, p.description 
FROM product p 
JOIN (SELECT product_id FROM category WHERE category_id IN (113, 119, 122, 124) GROUP BY product_id HAVING COUNT(*)=4) cat
  ON p.product_id = cat.product_id



и в этом коде нужно, чтобы между дочерними массивами (116,117,123) осуществлялось "И", а между элементами дочерних массивов "ИЛИ". По раздельности осуществить могу, но как это одновременно сделать, ума не приложу...
...
Рейтинг: 0 / 0
17.08.2013, 20:32:13
    #38369812
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
sillexo,

Попробуйте вместо COUNT(*) поиграться с функциями SUM(), BIT_OR(), BIT_AND()... там у вас достаточно нетривиальный фильтр получится... Вы точно "горящий проект" спасаете, а не "курсовую по логическим функциям" прогуляли?
...
Рейтинг: 0 / 0
17.08.2013, 20:54:00
    #38369824
sillexo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
Спасибо, посмотрю.

Точно проект.
...
Рейтинг: 0 / 0
17.08.2013, 21:03:35
    #38369828
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
sillexoи в этом коде нужно, чтобы между дочерними массивами (116,117,123) осуществлялось "И", а между элементами дочерних массивов "ИЛИ". По раздельности осуществить могу, но как это одновременно сделать, ума не приложу...
что-то типа такого можно
Код: sql
1.
2.
3.
4.
5.
6.
SELECT a.product_id FROM category a 
WHERE a.category_id IN (116,117,123) 
and exists (select 1 from category  b where a.product_id=b.product_id and b.category_id IN (113))
and exists (select 1 from category  b where a.product_id=b.product_id and b.category_id IN (119,122))
and exists (select 1 from category  b where a.product_id=b.product_id and b.category_id IN (123,124))
GROUP BY product_id HAVING COUNT(*)=3
...
Рейтинг: 0 / 0
18.08.2013, 01:32:31
    #38369926
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
miksoft
Код: sql
1.
2.
3.
4.
SELECT p.product_id, p.image, p.price, p.name, p.description 
FROM product p 
JOIN (SELECT product_id FROM category WHERE category_id IN (101, 102, 103, 104) GROUP BY product_id HAVING COUNT(*)=4) cat
  ON p.product_id = cat.product_id



Фу... Фу...
Не ожидал от тебя такого.
...
Рейтинг: 0 / 0
18.08.2013, 21:51:49
    #38370154
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
Т многие ко многим С через ТС
найти т, связаных с с1 и с2 и с3

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select t.*, #!!!!!
case
when c.id =c1 then 'a1';
when c.id = c2 then 'a2';
when c.id = c3 then 'a3',
else
null
end case; as `priznak`

from t join TC (on c.fk-idtc1 =tc.id1) join C on (c.fk-idtc2 = c.id2)
where
c.id2 IN (c1 ,c2 ,c3)

group by t.id
having count(distinct `priznak`) = 3


дефакто то что тебе написали.

у тебя с1 = с11 или с12 или с13
с2 = с21 или с22
с3 = с31 или с32 или с33 или с34

вот также через или пишешь в секцию кейс
в секции веар все варианты через запятую - с11,с12,с13,с21,....,с34
каунт также остаёться 3-

тоесть
веар нам какбы даёт результат для случая всё через ИЛИ
секция кейс ставит признак того, что даная запись попала в групу определённую
наши групы через И. кефинг проверит что запись попала во все групы которые через и
...
Рейтинг: 0 / 0
18.08.2013, 21:57:23
    #38370158
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
MasterZivmiksoft
Код: sql
1.
2.
3.
4.
SELECT p.product_id, p.image, p.price, p.name, p.description 
FROM product p 
JOIN (SELECT product_id FROM category WHERE category_id IN (101, 102, 103, 104) GROUP BY product_id HAVING COUNT(*)=4) cat
  ON p.product_id = cat.product_id




Фу... Фу...
Не ожидал от тебя такого.Это, как я посмотрю, нередко случается :)
Можешь обосновать?
С моей точки зрения, вариант если и не идеальный, то вполне имеющий право на жизнь. А с большой вероятностью и оптимальный.
...
Рейтинг: 0 / 0
19.08.2013, 05:00:42
    #38370243
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
sillexoнужно из бд вытянуть товары, которые соответствуют ВСЕМ выбранным категориям, я делаю так:

Код: sql
1.
2.
3.
4.
SELECT p.product_id, p.image, p.price, p.name, p.description 
FROM product p 
LEFT JOIN category cat ON (p.product_id = cat.product_id) 
WHERE cat.category_id IN (114, 119, 125, ... n)

Восстанавливаю по фотографии запросу схему базы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table product(
  product_id ind auto_increment primary key,
  name varchar(100)
  );

create table category(
  category_id int auto_increment primary key,
  name varchar(100),
  product_id int references product(product_id)
  );

Согласно этой схеме, каждая категория содержит только один продукт, что вряд ли соответствует реальности.
...
Рейтинг: 0 / 0
19.08.2013, 23:42:33
    #38371347
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка товара пренадлежащего нескольким категориям
Cygapb-007,

та да. я лично сразу это отфильтровал и писал пример кода для случая мени ту мени через промежуточную таблицу
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка товара пренадлежащего нескольким категориям / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]