2015-10-11 3 views
0

У меня есть куча данных, которыми в следующей схеме:Как найти расстояние до корня в структурированных данных дерева MySql?

Id | category | remote_id 
------------------------- 

Где remote_id ссылается на другой идентификатор в той же таблице.

Как я могу запросить это так, чтобы для каждой записи я мог найти расстояние до корневого элемента, который определен как строка, где идентификаторы и remote_id одинаковы?

В данных данных имеется только один корень.

Можно ли это сделать только через SQL без изменения этой схемы? Или необходимо, чтобы я вытаскивал данные в память в какое-то приложение на стороне сервера и моделировал его как обычное дерево?

ответ

0

процедура, как это должно работать, хотя я не проверял:

CREATE PROCEDURE getDistanceToRoot 
(
id INT 
) 
BEGIN 
    DECLARE distance INT DEFAULT 0; 
    DECLARE parentId INT DEFAULT NULL; 
    SET parentId = (SELECT remoteid from table where id = id); 
    WHILE (id != parentId) DO 
    SET count = count + getDistanceToRoot(parentId); 
    SET parentId = (SELECT remoteid from table where id = parentId); 
END WHILE; 
    SELECT distance; 
END; 

Он также будет медленным. Вы можете улучшить его производительность, как только вы настроите его на работу (как я уже сказал, я его не тестировал), сохраняя расстояние для каждого id в другой таблице после получения его, как часть процедуры.

+0

Как просмотреть результат? Что делать, если я хотел бы добавить ответ (расстояние до корня) в новый столбец для каждой строки? Сейчас я получаю сообщение об ошибке, в котором говорится, что подзапрос возвращает более 1 строки. –

+0

Также следует упомянуть, что коэффициент ветвления данных не фиксирован. –

+0

Эта процедура определенно не сработает. Идея будет работать либо как процедура или функция, но не как гибрид. –