SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 20.08.2013 11:38:11

dimsich
Участник
Зарегистрирован: 12.12.2011
Сообщений: 17

Выборка много ко многим

Привет всем)
Помогите разобраться с такой задачей.

Есть такие таблицы:
Products (id, name) - таблица товаров
Property_product (id, name) - х-ки товаров
Products_TO_Property_product (id_product, id_property_product) - промежуточная таблица связей

Допустим нужно выбрать все товары у которых свойства id_property_product (3 и 20 и 7)?
То есть, чтобы у этих товаров присутствовали все свойства, а не допустим только одно из них.
Буду очень благодарен за ответы.

Неактивен

 

#2 20.08.2013 14:15:00

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

Re: Выборка много ко многим

select id_product from Products_TO_Property_product where id_property_product in (3,20,7) group by 1 having count(*)=3;

Неактивен

 

#3 20.08.2013 15:09:59

dimsich
Участник
Зарегистрирован: 12.12.2011
Сообщений: 17

Re: Выборка много ко многим

Спасибо!!! Супер, всё работает. Вы могли бы объяснить вот эту часть запроса group by 1 having count(*)=3
Заранее благодарен!

Неактивен

 

#4 20.08.2013 15:27:49

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

Re: Выборка много ко многим

group by 1 having count(*)=3 -- сгрупировать по полю id_product и оставить только имеющих 3 совпадения.
выполните для наглядности след запросы:

select id_product, count(*) from Products_TO_Property_product where id_property_product in (3,20,7) group by 1 having count(*)=3;

select id_product, count(*) from Products_TO_Property_product where id_property_product in (3,20,7) group by 1;

Неактивен

 

#5 20.08.2013 15:54:56

dimsich
Участник
Зарегистрирован: 12.12.2011
Сообщений: 17

Re: Выборка много ко многим

Теперь задача усложняется.
В этом запросе из промежуточной таблицы (Products_TO_Property_product) выбираются id_product:

select id_product from Products_TO_Property_product where id_property_product in (3,20,7) group by 1 having count(*)=3; выбираются id_product.

Нужно выбрать название товара (name) из таблицы Products (id, name).
Как я понимаю нужно использовать INNER JOIN
У меня получился такой запрос:

SELECT Products_TO_Property_product.id_product, Products.name FROM Products INNER JOIN Products_TO_Property_product ON Products_TO_Property_product.id_product=Products.id WHERE id_property_product in (3,20,7) group by 1 having count(*)=3;

Но что-то он не правильно работает...
В чём может быть причина?)

Неактивен

 

#6 20.08.2013 16:05:54

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

Re: Выборка много ко многим

select name from Products p join
(select id_product from Products_TO_Property_product where id_property_product in (3,20,7) group by 1 having count(*)=3) t on p.id=t.id_product;

Неактивен

 

#7 20.08.2013 16:23:09

dimsich
Участник
Зарегистрирован: 12.12.2011
Сообщений: 17

Re: Выборка много ко многим

Спасибо огромное!!!
Насколько прожорлив данный запрос?

Неактивен

 

#8 20.08.2013 16:31:11

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

Re: Выборка много ко многим

Что вы под этим подразумеваете?

Неактивен

 

#9 20.08.2013 16:36:23

dimsich
Участник
Зарегистрирован: 12.12.2011
Сообщений: 17

Re: Выборка много ко многим

Если в таблицах будет большое количество записей. Данный запрос, будет выполняться слишком долго?
Наверное глупый вопрос, легче заполнить таблицы и самому проверить)
Но всё же?

Неактивен

 

#10 20.08.2013 16:47:26

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

Re: Выборка много ко многим

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

Неактивен

 

#11 20.08.2013 16:49:24

dimsich
Участник
Зарегистрирован: 12.12.2011
Сообщений: 17

Re: Выборка много ко многим

Спасибо за ответы. Вы мне очень помогли!!!

Неактивен

 

Board footer

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