Всем привет! Возникла проблем при выборке, слишком долгая выборка.
Есть таблицы с ценами
price - tovar_id, categories_id
Есть таблица категорий
categories
Есть таблица товаров
tovar - categories_id
В таблице есть вложенности, т.е категория может принадлежать другой категории.
1) Задача: Вывести все под категории, текущей категории.
У категории Продукты есть под категория апельсины, а в апельсинах есть еще категории.
И нужно вывести все под категории, и под категории категорий.
Я создал таблицу categories_link - cat_id(текущая категория), dosh_id(к какой категории принадлежит)
В этой мы можем получить все возможные категории, конкретной категории.
К примеру если нам нужно получить все возможные под категории Продукты (id = 1) запрос будет таким
SELECT dosh_id FROM categories_link WHERE cat_id=1
В итоге у нас будет примерно 1000 категорий. Хорошо категории получили, теперь нужно собрать по ним цены.
Я использовал массив, куда сохранил id категорий по которым нужно делать вывод и получилось примерно так
SELECT tovar_id FROM price WHERE categories_id IN (" . implode(',', $attrCategorisId) . ")
Суть в том что есть определенная логика выборки цен у товаров которые нужно поставить на 1 места, я здесь их не стал указывать.
У нас есть цены и id товаров которые должны быть на 1 местах, а затем все остальные. Составим запрос на выборку товаров
$attrTovarId - допустим тут мы получили id товаров которые нужно вывести в определенной последовательности.
(
SELECT * FROM tovar ORDER BY field('id', " . implode(',', $attrTovarId) . ")
)
UNION ALL
(
SELECT * FROM tovar WHERE NOT id IN ( " . implode(',', $attrTovarId) . " )
)
Как раз этот запрос очень тяжелый, в базе примерно 100 000 товаров. Посоветуйте плз как все это можно оптимизировать, может нужно использовать хранимые процедуры, курсоры и т.д. Буду рад каждому совету.