SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 25.02.2013 20:42:53

Имя занято
Участник
Зарегистрирован: 26.10.2011
Сообщений: 17

Объединение таблиц

Здравствуйте!

У меня есть две таблицы: таблица товаров и таблица товары_свойства

products
+---+--------+
| id  | name   |
+---+--------+
| 1  | Товар1 |
+---+--------+
| 2  | Товар2 |
+---+--------+
| 3  | Товар3 |
+---+--------+
| 4  | Товар4 |
+---+--------+

properties_products
id_property=1 - Класс ламината
id_property=2 - Порода дерева
+------------+------------+-------+
| id_property | id_product  | value   |
+------------+------------+-------+
| 1              | 1               | 33      |
+------------+------------+-------+
| 1              | 2               | 33      |
+------------+------------+-------+
| 1              | 3               | 32      |
+------------+------------+-------+
| 1              | 4               | 33      |
+------------+------------+-------+
| 2              | 1               | Дуб    |
+------------+------------+-------+
| 2              | 2               | Бук     |
+------------+------------+-------+
| 2              | 4               | Дуб    |
+------------+------------+-------+

Допустим, я хочу выбрать весь ламинат 33 класса породы Дуб (1 и 4 товар). Как должен примерно выглядеть такой запрос?

Неактивен

 

#2 25.02.2013 21:04:15

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Объединение таблиц

SELECT p.* FROM products p JOIN properties_products pp ON p.id=pp.id_product WHERE pp.`value`= 'Дуб';
Оно? Как учесть 33 я не очень понял.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 25.02.2013 21:13:03

Имя занято
Участник
Зарегистрирован: 26.10.2011
Сообщений: 17

Re: Объединение таблиц

Ну в том-то и дело, что данный запрос выбирает товары только по одному свойству. А как выбрать товары сразу по нескольким?
Такой ведь запрос уже не сработает:

SELECT p.* FROM products p JOIN properties_products pp ON p.id=pp.id_product WHERE pp.`value`= 'Дуб' AND pp.`value`= '33';

Отредактированно Имя занято (25.02.2013 21:13:47)

Неактивен

 

#4 25.02.2013 21:19:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Объединение таблиц

Такой конечно нет, но можно же так:
SELECT p.* FROM products p JOIN properties_products pp ON p.id=pp.id_product WHERE pp.`value`= 'Дуб' OR pp.`value`= '33';
или
SELECT p.* FROM products p JOIN properties_products pp ON p.id=pp.id_product WHERE pp.`value`IN ('Дуб','33');


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 25.02.2013 21:31:17

Имя занято
Участник
Зарегистрирован: 26.10.2011
Сообщений: 17

Re: Объединение таблиц

Но такие запросы вернут и ламинат 32 класса Дуб, и любой цвет 33 класса. Т. е. это получился оператор "или", а не "и".
Каким образом нужно тогда построить базу данных, чтобы возможно было искать товары сразу по нескольким свойствам?
http://www.interparket.ru/laminat/
или http://www.fcenter.ru/products.shtml?es … :30:r:2:1:

Неактивен

 

#6 25.02.2013 21:41:05

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Объединение таблиц

Видимо, нужно это после value разбить на два разных поля - в одном из них указывать класс, во втором материал. Ну и в этом случае в запросе учитывайте значения обоих полей в условии WHERE.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 25.02.2013 21:46:24

Имя занято
Участник
Зарегистрирован: 26.10.2011
Сообщений: 17

Re: Объединение таблиц

А если таких свойств, скажем, 5? Т. е. приходим к структуре, когда все свойства, по которым нужно делать выборку, должны быть столбцами в таблице товаров?

Неактивен

 

#8 25.02.2013 22:18:43

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Объединение таблиц

приходим к структуре, когда все свойства, по которым нужно делать выборку, должны быть столбцами в таблице товаров?

А что в этом плохого?

Неактивен

 

#9 25.02.2013 22:38:50

Имя занято
Участник
Зарегистрирован: 26.10.2011
Сообщений: 17

Re: Объединение таблиц

Ну ведь в каждой категории лежат разные товары с разными свойствами. Например, ламинат бывает 32 и 33 класса, а у паркетной доски такого свойства нет. А есть ещё плинтуса и клей, у которых вообще мало общего с ламинатом и паркетом. В итоге в базе будет много пустых ячеек.

Или для примера возьмем магазин электроники. У мобильных телефонов одни свойства, у телевизоров - другие, и т.д. Не всё же это в одну таблицу добавлять? Тогда либо для каждой категории своя таблица с товарами, либо одна таблица с товарами + дополнительная таблица со свойствами.

Неактивен

 

#10 25.02.2013 22:43:43

Имя занято
Участник
Зарегистрирован: 26.10.2011
Сообщений: 17

Re: Объединение таблиц

Я, кстати, нагуглил рабочий вариант для своих таблиц:


SELECT * FROM products AS p
JOIN properties_products AS pp ON(p.id_product = pp.id_product)
AND pp.id_property = 1 AND pp.value='33'
JOIN properties_products AS pp2 ON(p.id_product = pp2.id_product)
AND pp2.id_property = 2 AND pp2.value='Дуб'
 


Уж не знаю, как оно работает, но работает)

Неактивен

 

#11 03.03.2013 00:14:27

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Объединение таблиц

Если вернуться к вопросу про то, как хранить товары, у которых куча разных аттрибутов, то для этого используется EAV.
Есть еще мнение, что NoSQL хорошо подходит для таких вещей.
Посмотрите еще
http://sqlinfo.ru/forum/viewtopic.php?id=3034
и
http://sqlinfo.ru/forum/viewtopic.php?id=1536


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

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