Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Задачка по комбинаторике / 12 сообщений из 12, страница 1 из 1
13.02.2017, 23:27
    #39403817
jsmirnoww
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
Всем доброго времени суток.

Дано:
Интернет-магазин.
Товары имеют опции: цвет/размер/фасон/...
У разных товаров разное количество опций и их возможных значений.

Опции хранятся в таблице product_option:
product_id int
option_id int

Описание опции в отдельной таблице и оно нам не интересно.

Возможные значения опций в таблице product_option_value:
product_id int
option_id int
value_id int

Описание значений опций тоже в отдельной таблице, не рассматриваемой нами.

Требуется:
Заполнить заполнить структуру для хранения возможных комбинаций опций.
relatedoptions:
relatedoption_id int auto_increment primary key
product_id int

Набор связанных значений
relatedoptions_options:
product_id
relatedoption_id
option_id
value_id

Help, please!
...
Рейтинг: 0 / 0
13.02.2017, 23:57
    #39403826
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
Ну обычный cross join...
...
Рейтинг: 0 / 0
14.02.2017, 00:23
    #39403839
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
jsmirnoww,

Модератор: Временный бан за спам в подписи.
Договаривайтесь с модераторами других разделов о зачистке от вашего спама. Иначе бан превратится в постоянный.
...
Рейтинг: 0 / 0
14.02.2017, 14:21
    #39404153
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
jsmirnoww,

Модератор: Бан снял под обязательство больше не спамить.
Но моей просьбы убрать рекламные ссылки из предыдущих топиков это не отменяет.
...
Рейтинг: 0 / 0
14.02.2017, 16:10
    #39404272
jsmirnoww
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
Может я что то не понимаю, но по моему cross join'ом можно получить комбинации значений заранее известного и одинакового количества опций.
У меня же количество заранее неизвестно и может быть разным в разных товарах.

Если не трудно, набросайте запрос, если я ошибаюсь
...
Рейтинг: 0 / 0
14.02.2017, 16:27
    #39404286
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
CROSS JOIN объединяет каждую запись левой таблицы с каждой записью правой. А отбор по одинаковости начинается уже в секциях отбора (ON, WHERE), буде они есть.
...
Рейтинг: 0 / 0
14.02.2017, 23:53
    #39404511
jsmirnoww
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
чтобы не быть голословным, я подготовил и заполнил тестовые таблички
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
-- опции, применимые к товару
create table sql_ru_product_option(
	product_id int,
	option_id int
);

-- значения опций, доступные для товара
create table sql_ru_product_option_value(
	product_id int,
	option_id int,
	value_id int
);

-- описание опций, что бы разбавить сухие цифры
create table sql_ru_option_desc (
	option_id int primary key,
	option_desc varchar(128)
);

-- описание значений опций, для тех же целей
create table sql_ru_value_desc (
	value_id int primary key,
	option_id int,
	value varchar(128)
);

-- опции, применимые к товарам
insert into sql_ru_option_desc values (1, 'цвет'),(2, 'размер'),(3, 'сезон');

-- возможные значения этих опций
insert into sql_ru_value_desc values 
(1, 1, 'красный'),(2, 1, 'синий'),(3, 1, 'голубой'),
(4, 2, 'S'),(5, 2, 'M'),(6, 2, 'L'),(7, 2, 'XL'),
(8, 3, 'лето'),(9, 3, 'зима'),(10, 3, 'демизесон');

--  для товара номер один доступен только выбор размера 
insert into sql_ru_product_option 		values (1,2);
-- добавим к нему всю линейку размеров S,M,L,XL
insert into sql_ru_product_option_value	values (1,2,4),(1,2,5),(1,2,6),(1,2,7);

-- для товара номер два доступны опции цвет и размер
insert into sql_ru_product_option 		values (2,1);
insert into sql_ru_product_option 		values (2,2);
-- доступные цвета: красный, синий, голубой
insert into sql_ru_product_option_value	values (2,1,1),(2,1,2),(2,1,3);
-- доступные размеры: S,M,L,XL
insert into sql_ru_product_option_value	values (2,2,4),(2,2,5),(2,2,6),(2,2,7);

-- для товара три доступны и цвет, и размер, и сезон
insert into sql_ru_product_option 		values (3,1);
insert into sql_ru_product_option 		values (3,2);
insert into sql_ru_product_option 		values (3,3);
-- доступные цвета: красный, синий, голубой
insert into sql_ru_product_option_value	values (3,1,1),(3,1,2),(3,1,3);
-- для него доступны только размеры S,M,L
insert into sql_ru_product_option_value	values (3,2,4),(3,2,5),(3,2,6);
-- возможные сезоны: лето, зима
insert into sql_ru_product_option_value	values (3,3,8),(3,3,9);


на выходе надо получить sql_ru_relatedoptions_options
для товара №1
Код: sql
1.
2.
3.
4.
5.
product_id	relatedoption_id	option_id	value_id
1			1		2		4
1			2		2		5
1			3		2		6
1			4		2		7


для товара №2 мы должны получить связки каждого цвета с каждым доступным для него размером
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
product_id	relatedoption_id	option_id	value_id
2			5		1		1
2			5		2		4
2			6		1		1
2			6		2		5
2			7		1		1
2			7		2		6
2			8		1		1
2			8		2		7
2			9		1		2
2			9		2		4
2			10		1		2
2			10		2		5
2			11		1		2
2			11		2		6
2			12		1		2
2			12		2		7
2			13		1		3
2			13		2		4
2			14		1		3
2			14		2		5
2			15		1		3
2			15		2		6
2			16		1		3
2			16		2		7



если не трудно, набросайте запрос, который получит такие комбинации значений опций для одного товара, с неизвестным заранее количеством опций
...
Рейтинг: 0 / 0
15.02.2017, 07:49
    #39404562
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
Откуда взялось в выходном наборе поле relatedoption_id? в исходных данных ни такого поля, ни таких значений - нет.
...
Рейтинг: 0 / 0
15.02.2017, 12:07
    #39404743
jsmirnoww
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
AkinaОткуда взялось в выходном наборе поле relatedoption_id? в исходных данных ни такого поля, ни таких значений - нет.
это идентификатор связки опций. он был в первом сообщении изначально.
...
Рейтинг: 0 / 0
15.02.2017, 12:24
    #39404770
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
Брр... тогда я неверно понял задачу, получается. Тогда у тебя всё равно обычный cross join, но вот количество копий таблицы, которые нужно использовать, будет меняться в зависимости от количества опций для товара - то есть придётся реализовывать всё это в рамках ХП и динамического SQL. Как вариант, построить несколько запросов, каждый для своего количества опций (вряд ли их будет очень много), и выбирать нужный в зависимости от COUNT(sql_ru_product_option.option_id) для текущего sql_ru_product_option.product_id.
...
Рейтинг: 0 / 0
15.02.2017, 12:49
    #39404801
jsmirnoww
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
ну да, cross join c рекурсивным вызовом хранимой процедуры из цикла по курсору. в результате настолько сложная логика обработки события окончания набора данных курсора, что уходит очень много сил и времени на отладку. я бросил эту затею. фигачу запросы вручную для каждого возможного количества опций в товаре. если всё успешно, то за сегодня-завтра сделаю. Думаю это быстрее и с результат гарантирован.
Но! как-то не по феншую :(, поэтому и обратился к SQL-эгрегору
...
Рейтинг: 0 / 0
15.02.2017, 12:58
    #39404816
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задачка по комбинаторике
А курсор-то тут нафига? список таблиц можно получить вульгарным GROUP_CONCAT... причём сразу в готовом для включения в текст dSQL виде.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Задачка по комбинаторике / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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