Объединить запросы
771 сообщение
#16 лет назад
Всем доброго времени суток! Спасибо что заинтересовались моим вопросом.Суть:
есть БД MySQL, таблицы вида
id - autoincrement
id_r - ссылка на родительский id или 0, если верхнего уровня
head - заголовок
пример:
1, 0, заголовок...
2, 1, заголовок...
3, 2, интересующий каталог (К)
4, 0, заголовок...
и т.д.
Как построить путь из К до корня (id_r = 0)?
Сейчас это выглядит так:
while ($st!='0')
{
$sql = "SELECT * FROM `dir` WHERE `id` = $st";
$res = mysql_query ($sql, $conn);
$row = mysql_fetch_array($res);
$nam = $row;
$st1 = " — <a href='index.php?dir=$st'>$nam</a> ".$st1;
$st = $row;
}
Ворос:
можно ли этот момент оптимизировать до 1-го запроса к базе?
Заранее спасибо.
1090 сообщений
#16 лет назад
При такой организации дерева получить все дерево на произвольную глубину за один запрос невозможно.Если получение дерева одним запросом принципиально, тогда надо изменить способ организации дерева. Почитай про Nested Sets, для PHP есть наглядные примеры.
276 сообщений
#16 лет назад
Цитата ("alibek"):И еще, советую для корневых элементов id_r задавать NULL, а не 0.
Зачем?
На мой взгляд NULL такая "бяка", что с течением времени может подвести..... Впрочем моё мнение сформировалось на опыте работы с другими полями. Но все же за 10 лет работы с различными SQL серверами сложилось мнение, что NULLы лучше избегать.
1090 сообщений
#16 лет назад
Затем, что так правильнее.Если там указан 0, а записи с id=0 нет, то это нарушение логической целостности.
А навязывание своей логики (0 это особый такой ключ, который на самом деле не ключ) в обход системной ничего хорошего не дает.