| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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, но как "отджойнить" одну таблицу не знаю... Помогите пожалуйста, если можно с примером. Спасибо. |