SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.06.2012 23:07:57

nekulin
Завсегдатай
Зарегистрирован: 06.04.2012
Сообщений: 56

Работа с деревьями

Всем привет! Возникла проблем при выборке, слишком долгая выборка.

Есть таблицы с ценами
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 товаров. Посоветуйте плз как все  это можно оптимизировать, может нужно использовать хранимые процедуры, курсоры и т.д. Буду рад каждому совету.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson