|
|
|
| помогите разобраться, что-то уже всю голову сломал
есть таблица:
CREATE TABLE IF NOT EXISTS `product_char` (
`product_id` int(11) NOT NULL,
`char_group_id` int(11) NOT NULL,
`char_name_id` int(11) NOT NULL,
`char_value_id` int(11) NOT NULL,
`subProductCategory` int(11) NOT NULL,
`char_value_name` varchar(255) NOT NULL,
PRIMARY KEY (`product_id`,`char_group_id`,`char_name_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
--
-- Дамп данных таблицы `product_char`
--
INSERT INTO `product_char` (`product_id`, `char_group_id`, `char_name_id`, `char_value_id`, `subProductCategory`, `char_value_name`) VALUES
(67, 36, 40, 73, 12, '16:9'),
(67, 36, 43, 93, 12, 'Есть'),
(67, 43, 45, 85, 12, 'Есть'),
(70, 36, 39, 0, 15, '42"'),
(67, 36, 39, 72, 12, '32"(81,3см)'),
(67, 36, 42, 75, 12, '1366x768 пикс.'),
(67, 36, 41, 74, 12, 'Есть'),
(67, 36, 44, 77, 12, '50Гц'),
(67, 43, 46, 86, 12, 'Есть')
............
|
`product_id`, - ID продукта
`char_group_id`, - ID группы характеристик, Экран, функции и пр.
`char_name_id`, - ID имени характеристики привязанной к группе, например, для группы Экран: Диагональ, разрешение и т.п.
`char_value_id`, - не используется, будет удалена
`subProductCategory`, - ID подкатегории где находится товар(Led телевизоры, 3D кинотеатры, Ultra HD и т.п.
`char_value_name` - значение характеристики, допустим для Разрешения (1900:1080 пикс.)
Проблема:
Допустим с фильтра получили массив
<?
$array = Array
(
[39] => Array
(
[0] => '40"'
[1] => '32"'
)
[40] => Array
(
[0] => '16:9'
[1]=>'4:3'
)
[41] => Array
(
[0] =>'Есть'
)
)
|
Где ключи(39,40,41) - это ID имен характеристик, содержащие массив возможных значений
Нужно составить выборку из таблицы product_char таким образом, чтобы выбрать все ID товаров, удовлетворяющие этим условиям, т.е. выбираем товары, которые содержат характеристики со значениями 40" или 32", но исключить из них товары не содержащие характеристик 40 со значениями 16:9 или 4:3, и не содержащие характеристику 41 со значением 'Есть' и т.д. в соответствии с выбранными параметрами. | |
|
|
|
|
|
|
|
для: tvv123456
(26.02.2015 в 15:58)
| |
-- <?
SELECT t1.*
FROM `product_char` AS t1
JOIN `product_char` AS t2
ON t1.product_id = t2.product_id
AND t2.char_name_id = 40
AND t2.char_value_name IN('16:9', '4:3')
JOIN `product_char` AS t3
ON t1.product_id = t3.product_id
AND t3.char_name_id = 41
AND t3.char_value_name IN('Есть')
WHERE
t1.char_name_id = 39
AND t1.char_value_name IN('40"', '32"')
|
| |
|
|
|
|
|
|
|
для: Sfinks
(26.02.2015 в 21:13)
| | Чтобы было понятнее, можно записать иначе:
-- <?
SELECT
t1.*
FROM(
SELECT * FROM product_char WHERE char_name_id = 39 AND char_value_name IN('40"', '32"')
)t1
JOIN(
SELECT * FROM product_char WHERE char_name_id = 40 AND char_value_name IN('16:9', '4:3')
)t2 USING( product_id )
JOIN(
SELECT * FROM product_char WHERE char_name_id = 41 AND char_value_name IN('Есть')
)t3 USING( product_id )
|
| |
|
|
|
|
|
|
|
для: Sfinks
(26.02.2015 в 21:35)
| | А если у вас не MySQL, то можно и вообще просто:
-- <?
SELECT * FROM product_char WHERE char_name_id = 39 AND char_value_name IN('40"', '32"')
INTERSECT
SELECT * FROM product_char WHERE char_name_id = 40 AND char_value_name IN('16:9', '4:3')
INTERSECT
SELECT * FROM product_char WHERE char_name_id = 41 AND char_value_name IN('Есть')
|
| |
|
|
|
|
|
|
|
для: Sfinks
(26.02.2015 в 21:37)
| | остановись :D | |
|
|
|
|
|
|
|
для: Valick
(27.02.2015 в 00:20)
| | Иногда выбешивает тупость MySQL =)) | |
|
|
|
|
|
|
|
для: Sfinks
(26.02.2015 в 21:13)
| | Спасибо.
Только почему-то много записей получается, т.е.:
Сгенерировался запрос:
<?
SELECT t0.* FROM `product_char` AS t0
JOIN product_char AS t1
ON t0.product_id=t1.product_id AND t1.char_name_id AND t1.char_value_name IN('32\"(81,3см)','16:9')
JOIN product_char AS t2
ON t0.product_id=t2.product_id AND t2.char_name_id AND t2.char_value_name IN('32\"(81,3см)','16:9','Есть')
WHERE t0.char_name_id=39 AND t0.char_value_name IN('32\"(81,3см)') AND t0.subProductCategory=12
|
Выбирается 1 товар, но почему -то 24 раза повторяется строчка:
product_id char_group_id char_name_id subProductCategory char_value_name
67 36 39 12 32"(81,3см)
|
| |
|
|
|
|
|
|
|
для: tvv123456
(27.02.2015 в 12:33)
| | Тут с подсветкой увидел, что запрос неправильно генерируется.
Спасибо. Все заработало. | |
|
|
|
|