Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Как отректись от вложенных запросов


Автор: ivashka 28.7.2011, 21:55
Здравствуйте. Есть таблица вида:

id (auto_increment)
id_item (int(4), id товара)
value (int(4), id значения)

Вобщем суть в чем. В таблице сохраняются все параметры товаров.
Берем товар: Samsung 943N (id товара = 1)
Цвет черный - value=1 (поле валие)
Производитель Samsung value=2
Есть выход VGA (value=3)
и т.д. и еще очень много
Получаем записи вида:
id    id_item   value
1    1             1
2    1             2
3    1             3
и т.д.
(value и ID не обязательно совпадают)
Тоесть для одного товара есть много значений.

Я делаю запрос к таблице, который мне вернет id товара в которых есть только определенные параметры.

Сейчас запрос получается вида:
SELECT `id_item` FROM `ls_values_select` where (id_item IN (SELECT id_item FROM `ls_values_select` WHERE  `value`='31'  or  `value`='95'  or  `value`='93' )) and (id_item IN (SELECT id_item FROM `ls_values_select` WHERE  `value`='34' )) 

Каждый подзапрос ((id_item IN (SELECT id_item FROM `ls_values_select` WHERE  `value`='31'  or  `value`='95'  or  `value`='93' )), это то что хочет видеть пользователь из одной групы параметров, припустим:

Група №1 (производитель):
Samsung  (id параметра - 1)
Asus (id параметра - 2)
Acer (id параметра - 3)
DELL (id параметра - 4)

Група №2 (цвет):
черный (id параметра - 5)
белый (id параметра - 6)
синий (id параметра - 7)
серый (id параметра - 8)
 и т.д.

и груп получается около 100.

Этот запрос (что я привел выше) прекрасно работал пока товаров было меньше 100, а дальше каждый такой запрос на выделеной машине исполняется около 30-40 секунд, эт не есть гуд.

Опишу запрос на словах:

Хочу выбрать все товары у которых производитель либо Samsung либо DELL и обязательно черные, в результате получится запрос:
SELECT `id_item` FROM `ls_values_select` where (id_item IN (SELECT id_item FROM `ls_values_select` WHERE  `value`='1'  or  `value`='4')) and (id_item IN (SELECT id_item FROM `ls_values_select` WHERE  `value`='5' )) 

Как мне решить проблему со скоростью?
Можно ведь как-то переписать запрос, что бы не было под запросов. 
Мысль наталкивает на JOIN, но как "отджойнить" одну таблицу не знаю...

Помогите пожалуйста, если можно с примером. Спасибо.

Автор: Akina 28.7.2011, 23:03
Цитата(ivashka @  28.7.2011,  22:55 Найти цитируемый пост)
Хочу выбрать все товары у которых производитель либо Samsung либо DELL и обязательно черные, в результате получится запрос:

Код

SELECT `id_item` 
FROM `ls_values_select`
WHERE  `value`='Samsung'
OR `value`='DELL'
OR `value`='чёрный'
GROUP BY `id_item` 
HAVING COUNT(`id_item`) = 2

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)