SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 16.07.2018 16:37:04

Vadym007
Участник
Зарегистрирован: 16.07.2018
Сообщений: 8

Выборка даных при связи многие ко многим

Есть таблица с товарами goods, она связана с таблицей сategories (многие ко многим), также она связана с таблицей filters_values (многие ко многим). Каждый товар может иметь несколько категорий и фильтров. Нужно создать запрос для получения всех товаров при заданых аlias категории и id-шников значений фильтров. Буду благодарен за помощь

Неактивен

 

#2 16.07.2018 18:38:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка даных при связи многие ко многим

проиллюстрируйте на примере с тестовыми данными в виде
create table ..
insert into ..
и какой результат должен вернуть запрос

Неактивен

 

#3 16.07.2018 23:20:34

Vadym007
Участник
Зарегистрирован: 16.07.2018
Сообщений: 8

Re: Выборка даных при связи многие ко многим

CREATE TABLE  goods (
    id int NOT NULL AUTO_INCREMENT,
    name varchar(255) NOT NULL,
    PRIMARY KEY (id)
);

insert into goods(name) values('product1');
insert into goods(name) values('product2');
insert into goods(name) values('product3');
insert into goods(name) values('product4');
insert into goods(name) values('product5');
insert into goods(name) values('product6');
insert into goods(name) values('product7');
insert into goods(name) values('product8');

CREATE TABLE  categories (
    id int AUTO_INCREMENT,
    title varchar(255),
    alias varchar(255),
    PRIMARY KEY (id)
);

insert into categories(title, alias) values('Категория 1', 'cat_1');
insert into categories(title, alias) values('Категория 2', 'cat_2');
insert into categories(title, alias) values('Категория 3', 'cat_3');

CREATE TABLE  goods_category (
    product_id int,
    category_id int,
    PRIMARY KEY (product_id, category_id)
);

insert into goods_category(product_id, category_id) values (1,1);
insert into goods_category(product_id, category_id) values (2,1);
insert into goods_category(product_id, category_id) values (3,2);
insert into goods_category(product_id, category_id) values (4,1);
insert into goods_category(product_id, category_id) values (5,1);
insert into goods_category(product_id, category_id) values (6,1);
insert into goods_category(product_id, category_id) values (7,1);
insert into goods_category(product_id, category_id) values (8,1);

CREATE TABLE  filter_values (
id int AUTO_INCREMENT,
value varchar(100),
PRIMARY KEY (id)
);

insert into filter_values(value) values (41);
insert into filter_values(value) values (42);
insert into filter_values(value) values (43);
insert into filter_values(value) values (44);
insert into filter_values(value) values ('blue');
insert into filter_values(value) values ('red');
insert into filter_values(value) values ('orange');

CREATE TABLE  goods_filter_values (
    product_id int,
    value_id int,
    PRIMARY KEY (product_id, value_id)
    );


insert into  goods_filter_values(product_id, value_id) values (1,1);
insert into  goods_filter_values(product_id, value_id) values (1,2);
insert into  goods_filter_values(product_id, value_id) values (1,3);
insert into  goods_filter_values(product_id, value_id) values (1,6);
insert into  goods_filter_values(product_id, value_id) values (2,7);
insert into  goods_filter_values(product_id, value_id) values (3,2);
insert into  goods_filter_values(product_id, value_id) values (3,3);
insert into  goods_filter_values(product_id, value_id) values (3,5);
insert into  goods_filter_values(product_id, value_id) values (3,6);
insert into  goods_filter_values(product_id, value_id) values (4,1);
insert into  goods_filter_values(product_id, value_id) values (4,7);
insert into  goods_filter_values(product_id, value_id) values (5,1);
insert into  goods_filter_values(product_id, value_id) values (5,2);
insert into  goods_filter_values(product_id, value_id) values (6,3);
insert into  goods_filter_values(product_id, value_id) values (6,4);
insert into  goods_filter_values(product_id, value_id) values (6,7);
insert into  goods_filter_values(product_id, value_id) values (7,1);
insert into  goods_filter_values(product_id, value_id) values (7,6);
insert into  goods_filter_values(product_id, value_id) values (8,2);
insert into  goods_filter_values(product_id, value_id) values (8,6);



Результат должен быть следующим: если фильтры не применены, то должны быть выведены все товары из заданой категории, если применён какойто фильтр (или несколько фильтров) должны быть выведены товары которые имеют заданые фильтры

Неактивен

 

#4 16.07.2018 23:50:51

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка даных при связи многие ко многим

select goods.* from goods join goods_category on goods.id=product_id join categories on category_id= categories.id where alias='заданая категория'

при наличии фильтров товары должны удовлетворять всем параметрам или части? если первое, то см эту тему

Неактивен

 

#5 17.07.2018 00:07:56

Vadym007
Участник
Зарегистрирован: 16.07.2018
Сообщений: 8

Re: Выборка даных при связи многие ко многим

если заданные фильтры то должны отображаться только те товары к которым привязаны заданные (все) фильтры. Например в товара А есть фильтры з id 1 2 3 4 5, в товара B id - 2 3. Если заданные фильтры с id 2 3 то отображаются оба товара, а если к примеру 1 2 3 то только товар А

Неактивен

 

#6 17.07.2018 00:15:38

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка даных при связи многие ко многим

по указанной ссылке как раз такой случай и разобран, толко названия таблиц другие

Неактивен

 

#7 17.07.2018 00:25:00

Vadym007
Участник
Зарегистрирован: 16.07.2018
Сообщений: 8

Re: Выборка даных при связи многие ко многим

спасибо)

Неактивен

 

Board footer

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