[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод категорий, статей, связвнные таблицы
AmberLEX
Пример.
Есть две таблицы: категрии и статьи, связь один-ко-многим (в одной категории может быть несколько статей)

Есть таблица categories с полями:
сid      - ключ
parent - родительская категория
catname - Название категории</span>
Заполнена так:
сid  parent  catname
1 0 razdel_1
2 0 razdel_2
3 0 razdel_3
4 1 category_1.1
5 2 category_2.1
6 2 category_2.2
7 3 category_3.1
Все категории с parent=0 будем считать разделами. Раздел не может иметь статей.

И таблица articles с полями:
id    - ключ
cid - внешний ключ (ключ категории к какой относится статья)
name - Название статьи
text - Текст статьи

Задача 1.
Вывести на странице категории в таком виде:
razdel_1
- category_1.1
razdel_2
- category_2.1
- category_2.2
razdel_3
- category_3.1>
Как это сделать правильно? Есть ли стандартное решение? (одним запросом к БД, например)
В MySQL, наверное есть средство, как это делать?
Я делел так (в основном средствами php), но понимаю, что два цикла это неправильно и накладно, наверное (хотя и работает)
$res_razdel = mysql_query("SELECT * FROM categories WHERE parent=0");
while($row_razdel = mysql_fetch_assoc($res_razdel))
{
// Выводим название раздела (категория с parent=1)
echo $row_razdel['name'].'<br />';

$res_category = mysql_query("SELECT * FROM categories WHERE parent=".$row_razdel['id']);
while($row_category = mysql_fetch_assoc($res_category))
{
// Выводим название категории
echo '- ' . $res_category['name'] . '<br />';
}
}

Задача 2.
При нажатии на какую-либо категорию, вывести на страницу:
1. Название этой категории
2. Названия статеи этой категории (список статей)

Тут тоже как-то неоптимизировано у меня выходит. Делел примерно так:
$cid = (int)$_GET['cid'];

// Получаем имя категории
$res = mysql_query("SELECT catname FROM categories WHERE cid=$cid");
list($catname) = mysql_fetch_row($res);

// Выводим название категории
echo '<h3>' . $catname . '</h3>';

// Получаем список статеи этой категории
$res = mysql_query("SELECT id, name FROM articles WHERE cid=$cid");
while($row = mysql_fetch_assoc($res))
{
// Выводим названия статей этой категории
echo $row['name'] . '<br />';
}
Итого.
В простейшем случае:

1. Если на странице выводятся разделы и категории, то имеем два запроса и два цикла while (Задача 1). При нажатии на категорию (другая страница) - два запроса и цикл while (Задача 2)

2. А если на странице сайта всегда находится слева блок разделов и категорий и при нажатии на одну из категорий, справа выводится название этой категории и список статей для нее - тогда вообще имеем 4 запроса к БД и три цикла while для одной страницы сайта (че-то дофига выходит)!!!

Кажись, это довольно стандартная и часто используемая схема. Хотелось бы иметь нормальное оптимальное решение на такой случай.
В MySQL я не очень силен, но мне кажется это проще решается.
P.S. Думаю, другим это тоже будет полезно и интересно.
Вобщем как это сделать нормально (чтоб не стыдно людям показать было smile.gif )

_____________
1. Чудес не бывает.
2. Дерьмо случается.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.