Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отректись от вложенных запросов 
:(
    Опции темы
ivashka
Дата 28.7.2011, 21:55 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Здравствуйте. Есть таблица вида:

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, но как "отджойнить" одну таблицу не знаю...

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

Это сообщение отредактировал(а) ivashka - 28.7.2011, 21:56
PM MAIL   Вверх
Akina
Дата 28.7.2011, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(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



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.