WedX - журнал о программировании и компьютерных науках

MySQL – получение родительского идентификатора верхнего уровня в иерархии

Вот моя структура таблицы...

ТАБЛИЦА : position_hierarchy_level

id parent_position_id position_id
 1 1                  2
 2 2                  3
 3 3                  4
 4 4                  5
 5 5                  6
 6 6                  7
 7 7                  8
 8 8                  9
 9 9                  10
 10 10                11
 11 11                12
 12 12                13
 13 13                14
 14 14                15

Мой запрос для получения parent_position_id определенного position_id:

select `parent_position_id` from `position_hierarchy_level` where position_id= 15;

Но как я могу получить самого верхнего родителя определенного position_id? Например, самым верхним parent_position_id из position_id 15 будет 1.

Есть ли удобный способ получить это значение с помощью одного запроса? Или мне нужно создать цикл в PHP?

17.04.2012

  • Я не вижу ни одной строки с id = 15 17.04.2012

Ответы:


1

Ваша структура базы данных не позволит вам сделать это, если не будет 15 или более объединений. Вы используете модель списка смежности. Попробуйте использовать модель вложенных наборов

Вот пример с php

17.04.2012

2

Попробуй это:

DELIMITER $$

CREATE FUNCTION getTopParentPositionId(positionId INT) RETURNS INT DETERMINISTIC 
BEGIN
    DECLARE x INT;
    DECLARE y INT;
    SET x = positionId;
    sloop:LOOP
        SET y = NULL;
        SELECT parent_position_id INTO y FROM position_hierarchy_level WHERE position_id = x;
        IF y IS NULL THEN
            LEAVE sloop;
        END IF;  
        SET x = y;
        ITERATE sloop;
    END LOOP;
    RETURN x;
END $$

DELIMITER ;

Затем:

SELECT getTopParentPositionId( 5 );

Очевидно, вы не единственный кто изучил такое решение :)

17.04.2012

3

Похоже на ту же проблему: Рекурсивная функция PHP для отображения списка смежности

Использование одного запроса с mysql может быть другим. Возможно, вы могли бы решить эту проблему с помощью хранимой процедуры.

17.04.2012
  • Мне просто нужен самый верхний родитель 17.04.2012
  • выберите id, parent_position_id, position_id из position_hierarchy_level, где parent_position_id=min(parent_position_id) — или я не понял проблемы? 17.04.2012
  • лучше: выберите id, position_id из position_hierarchy_level в соответствии с ограничением parent_position_id 1 17.04.2012
  • я хочу получить parent_position_id, используя определенный position_id, который должен повторяться в каждой записи. 17.04.2012
  • @Broncko, ему нужны данные дерева, чтобы получить идентификатор самого верхнего родителя. 17.04.2012
  • Тогда вам следует подумать об использовании вложенного множества. Это определенно лучше работает с глубокими иерархическими структурами. de.wikipedia.org/wiki/Nested_Sets 17.04.2012

  • 4

    если я правильно понимаю, и вы хотите, чтобы наивысший position_id имел 1 для parent_position_id и так далее...

    1 . SET parent_position_id для автоматического увеличения

    2 . выберите position_id из порядка таблицы по описанию position_id и поместите их в массив

    3 . обрезать таблицу

    4 . вставить массив в таблицу

    17.04.2012

    5

    С этой структурой таблицы лучший вариант, который у вас есть, - это цикл в php.

    Если структуру таблицы вы можете свободно изменить (в случае, если проект еще не активен), вы можете изучить структуру под названием Closure Tables. Вы можете найти простой пример использования/настройки в эта статья.

    В любом случае вы сможете найти гораздо больше информации по этому вопросу в антипаттернах SQL книга.

    17.04.2012

    6

    Есть ли удобный способ получить его с помощью одного запроса?

    Я думаю НЕТ, посмотрите здесь для иерархических запросов в MySQL

    мне нужно создать оператор цикла в PHP?

    Я думаю да.

    17.04.2012
    Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]