Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с хитрым запросом / 6 сообщений из 6, страница 1 из 1
18.02.2015, 12:10:03
    #38882710
Василий Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с хитрым запросом
Добрый день,

Помогите составить запрос, необходимо выбрать листы(фэйворитс), в которых находятся товары (1 ко многим) у товаров есть категории (1 ко многим), у одного товара может быть много категорий.

Необходимо фильтровать листы, так чтобы они выводились только тогда когда товары имеются во всех категориях , к примеру:

Делаем выборку по категории массаж, рестницы, ногти, необходимо чтобы в листе были товары во всем перечне этих категорий, может быть 1 товар в 3х категориях или 3 товара у каждого по одной категории, вообщем чтобы они все присутствовали.

Таблицы:
авторЛисты `lists` :
id, name, added

Связующая листы с продуктами `lists_product_ids` :
id, list_id, product_id

Продукты `product` :
id, name, description

Связующая продукты категории `product_category_ids` :
id, product_category_id, product_id

Категории `category` :
id, name


Запрос, который составил, он работает не верно, поскольку выбирает лист, если даже имеется 1 товар в 1ой категории, фильтром тут не пахнет.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT l.id, l.name, l.added 
FROM `lists` `l` 
	LEFT JOIN `lists_product_ids` `lpi` ON l.id=lpi.list_id 
	RIGHT JOIN 
		(
			SELECT p.id 
			FROM `product` `p` 
				LEFT JOIN `product_category_ids` `pci` ON pci.product_id=p.id 
				LEFT JOIN `product_category` `pc` ON pc.id=pci.product_category_id 
			WHERE (pc.name IN ("MASSAGE", "EYELASHES", "NAILS")) 
			GROUP BY p.id 
		) as products ON `lpi`.product_id=products.id  
GROUP BY l.id ORDER BY l.added DESC




Спасибо.
...
Рейтинг: 0 / 0
18.02.2015, 12:20:22
    #38882725
Помогите с хитрым запросом
Василий Р.,

читать про реляционное деление и его реализацию на EXISTS-подзапросах, либо посредством запросов с GROUP BY + HAVING
...
Рейтинг: 0 / 0
18.02.2015, 13:28:14
    #38882826
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с хитрым запросом
пора кому-то в фак дописать. а то стабильно каждую одну две недели будет вопрос на тему - фильтр по всем категориям.

аля заготовка для фака

возможные варианты по памяти постов на этом форуме.

1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select * 
from table
where
 exists(...proverka 1kategorii)
and
exists(...proverka 2kategorii)
and
....
and
exists(...proverka N kategorii)



2
Код: sql
1.
2.
3.
4.
5.
6.
select f1,..,fn, count(distinct kategoriya) as 'skoko_kategorii'
from table
group by f1,..,fm
having `skoko_kategorii` = N
#где N - число сверяемых категорий
#f1,...,fm - набор полей товара(не зависящих от категории ни как)



3
--влом придумывать - через переменные

4
лень писать - через N join-ов, аля первый вариант, только через джоины.

5
пойти от обратного

взять товары не из чорного списка - чорный список товаров, это товары которые не имеют хотябы одной категории. - и писать долго, и для базы подобное выполнять не быстро.
...
Рейтинг: 0 / 0
18.02.2015, 15:27:44
    #38882993
Помогите с хитрым запросом
Никто не знает чтоли ?
...
Рейтинг: 0 / 0
19.02.2015, 06:29:31
    #38883477
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с хитрым запросом
ПроходилМимо,


ну примерно так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select *
from lists l
join
(
select 
  count(1) cnt,
  lp.list_id, 
  c.name
lists_product_ids lp 
join product_category_ids pc on pc.product_id = lp.product_id
join category c on c.id = pc.category_id
where c.name in ("MASSAGE", "EYELASHES", "NAILS")) 
group by 
  lp.list_id, 
  c.name
having count(1)  = 3
) zz
where zz.list_id = l.id
...
Рейтинг: 0 / 0
19.02.2015, 16:27:30
    #38884196
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с хитрым запросом
точнее так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select *
from lists l
join
select zz.list_id
from
(
select 
  distinct
  lp.list_id, 
  c.name
lists_product_ids lp 
join product_category_ids pc on pc.product_id = lp.product_id
join category c on c.id = pc.category_id
where c.name in ("MASSAGE", "EYELASHES", "NAILS")) 
) zz
group by zz.list_id
having count(1) = 3
) yy
where yy.list_id = l.id
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с хитрым запросом / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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