Оптимизация кода

codsteep

Новичок
Оптимизация кода

Есть база, в ней три таблицы:
CAT ( id_c | name_c) - таблица с категорией товара, около 100 записей
SUBCAT ( id_sc | name_sc | id_c) - таблица с подкатегорией товара, id_c - идентификатор категории, около 1000 записей.
LISTPROD (id_t | name_t | id_c | id_sc) - сам товар, с идент. категории и подкатегрии..., около 5000 записей
Необходима выводить на одной стр. товар из категории с подкатегорией и именем товара... т.е., что то вроде:

Категория1
Подкатегория1
Товар1
Товар2
Товар3
Подкатегория2
Товар4
Товар5
Товар6

Реалезованно примерно так:
PHP:
"SELECT * FROM CAT WHERE id_c='".$id_c."'"
echo "$name_c";
while{
"SELECT * FROM SUBCAT WHERE id_c='".$id_c."'"
echo "$name_sc";
while{
"SELECT * FROM LISTPROD WHERE id_c='".$id_c."' AND id_sc='".$id_sc."'"
echo "$name_t"
}
}
Т.е. вложенным while.... но есть подозрение, что получается слишком громоздко... можно ли это оптимизировать?
 
Нет... Какое меню? Просто на страницу выводиться...
Раньше всё проще было... На страницу выводился только список подкатегорий-типа линки, а уже щёлкнув по ним получали товары... А теперь всё вместе выводить надо.
Так можно ли этот код улучшить или нет?
 
Можно!
LISTPROD (id_t | name_t | id_c | id_sc)- id_sc нафик не нужно
А лучше вообще заменить три таблицы- одной
id | parent_id | name
 
без id_sc - никак.... скорее id_c, можно было бы убрать.
id_c - нужно для другого запроса))))
Во первых как я заменю три таблицы одной? Во вторых Не слишком большая таблица будет??
 
А что ту подробнее?

SELECT * FROM LISTPROD WHERE id_c='".$id_c."'

А дальше все делаешь ПЫХом.
 
Э... не понял, всё равно придётся ещё запросы делать
SELECT * FROM LISTPROD WHERE id_c='".$id_c."'- я получу только спискок товаров в этой категории, а надо, что б они были разбиты на подкатегории:
Вывод вот такой:

Железо
----
->Круглое
--->С зазубринами
--->С синевой
--->Гнутое
--->Гнутое и выправленное
->Не Круглое
--->Без зазубринами
--->Без синевой
--->Не Гнутое
--->Не Гнутое и выправленное
 
codsteep
>>а надо, что б они были разбиты на подкатегории

А на подкатегории уже ПЫХом. А что бы было проще, то лучше так:
SELECT * FROM LISTPROD WHERE id_c='".$id_c."' ORDER BY id_sc

-~{}~ 18.05.04 10:46:

Если тебе надо выводить сразу и все категории а не только подкатегории, то:
SELECT * FROM LISTPROD ORDER BY id_c, id_sc
 
Ну с сортировкой понятно.... А как я ПХП разобью на подкатегории?? Имена подкатегории хранятся вместе с id_sc хранятся в БД! Т.е. тоже запрос надо делать!

-~{}~ 18.05.04 10:47:

нет. категории не надо
 
codsteep
Имена подкатегорий можно либо приджойнить, либо предварительны вытащить в масив.
 
Ну вот получил я два массива в одном товар в другом подкатегории...А как тепрерь их перебрать?...
Что то типа получам в цикле id_sc n-го эл-та массива с подкат., и выбираем все эл-ты с таким же id_sc из массива с товаром?
 
Выводишь товары пока категория товара равна категории предыдущего товара, если категория меняется, выводим категорию и дальше уже товары для нее.
 
Действительно, так лучше....
И ещё вопрос. насколько это эффективнее чем, самый первый пример?
 
>>И ещё вопрос. насколько это эффективнее чем, самый первый пример?

Вот как раз в этом и заключается твоя задача проверить эфективность данного метода :)
 
codsteep
странный ты.
тебе же дали совет по оптимизации (в одну таблицу все) и найти приемлемые классы для обработки дерева (nested_sets)
 
Romantik
Кстати все в одном дереве будет работать медленее.
 
Falc
У меня подобное, только формировало меню, было давно
Потом нехватило вложенности (кстати тоже в будущем нужно бывает) и перешел на дерево в одной таблице... прирост скорости был примерно на 20%
 
Romantik
Я не спорют с тем что в одном дереве универсальнее и удобнее.
Но все-таки когда все в одной таблице это медленее.
А твой прирост я подозреваю связан с тем сто ты более эффективно написал новые скрипты нежели были старые.

Если человеку нужно, только ускорить один скрипт, то нет смысла менять структуру базы и переписывать весь сайт.
 
Сверху