Объединить запросы
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 есть наглядные примеры.
1090 повідомлень
#16 років тому
И еще, советую для корневых элементов id_r задавать NULL, а не 0.
276 повідомлень
#16 років тому
Цитата ("alibek"):И еще, советую для корневых элементов id_r задавать NULL, а не 0.
Зачем?
На мой взгляд NULL такая "бяка", что с течением времени может подвести..... Впрочем моё мнение сформировалось на опыте работы с другими полями. Но все же за 10 лет работы с различными SQL серверами сложилось мнение, что NULLы лучше избегать.
1090 повідомлень
#16 років тому
Затем, что так правильнее.Если там указан 0, а записи с id=0 нет, то это нарушение логической целостности.
А навязывание своей логики (0 это особый такой ключ, который на самом деле не ключ) в обход системной ничего хорошего не дает.