Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: запрос для фильтра
 
 автор: tvv123456   (26.02.2015 в 15:58)   письмо автору
 
 

помогите разобраться, что-то уже всю голову сломал
есть таблица:

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 со значением 'Есть' и т.д. в соответствии с выбранными параметрами.

  Ответить  
 
 автор: Sfinks   (26.02.2015 в 21:13)   письмо автору
 
   для: 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:35)   письмо автору
 
   для: 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 USINGproduct_id )
JOIN(
  
SELECT FROM product_char WHERE char_name_id 41 AND char_value_name IN('Есть')
)
t3 USINGproduct_id )

  Ответить  
 
 автор: Sfinks   (26.02.2015 в 21:37)   письмо автору
 
   для: 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('Есть')

  Ответить  
 
 автор: Valick   (27.02.2015 в 00:20)   письмо автору
 
   для: Sfinks   (26.02.2015 в 21:37)
 

остановись :D

  Ответить  
 
 автор: Sfinks   (27.02.2015 в 01:13)   письмо автору
 
   для: Valick   (27.02.2015 в 00:20)
 

Иногда выбешивает тупость MySQL =))

  Ответить  
 
 автор: tvv123456   (27.02.2015 в 12:33)   письмо автору
 
   для: 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 в 13:35)   письмо автору
 
   для: tvv123456   (27.02.2015 в 12:33)
 

Тут с подсветкой увидел, что запрос неправильно генерируется.
Спасибо. Все заработало.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования