Как оптимально получить материнские элементы из базы?

Например есть таблица
id
pid
name

есть оптимальный способ получить все элементы одной ветки, одним sql запросом?
например для Breadcrumb
В голову приходит одно решение запросить все элементы и записать $arr[pid]
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Не указано, что за сервер SQL используется. Вот, например, для MySQL 8:
WITH RECURSIVE `cte` AS (
  SELECT `id`, `pid`, `name`, 0 AS `level`
    FROM `table`
  UNION SELECT `p`.`id`, `p`.`pid`, `p`,`name`, `cte`.`level` + 1 AS `level`
    FROM `cte` 
    JOIN `table` AS `p` ON `p`.`id` = `cte`.`pid`
)
SELECT `id`, `name`, `level`
  FROM `cte`
  ORDER BY `level`
Ответ написан
Enokin
@Enokin
Full-stack разработчик
На php можно так попробовать, но тут не один запрос

$query = "SELECT id, pid, name FROM your_table";
$result = $mysqli->query($query);

$items = [];
while($row = $result->fetch_assoc()){
    $items[$row['id']] = ['pid' => $row['pid'], 'name' => $row['name']];
}

function buildTree(array $elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as $element) {
        if ($element['pid'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }

    return $branch;
}

$tree = buildTree($items);
Ответ написан
phaggi
@phaggi
лужу, паяю, ЭВМы починяю
Элдор Суванов, почитайте статью. Там рассмотрены основные варианты структур, реализующих решение вашей проблемы, соответствуюзих им классов и соответствующих атрибутам этих классов запросов sql.
spoiler
Вы должны были сначала поискать, потом сюда писать вопрос. Публиковать вопросы, ответ на которые легко найти поиском в интернете, запрещено (п.2.2 Регламента). Я, к примеру, нашел за 5 секунд по запросу «sql цепочка родителей»
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы