2016-08-09 2 views
0

У меня есть таблица, как этотКак выбрать таблицу базы на нем колонке

+-------------+---------------+-----------+ 
| employee_id | employee_name | upline_id | 
+-------------+---------------+-----------+ 
| 1   | Andin   | 0   | 
+-------------+---------------+-----------+ 
| 2   | Budi   | 1   | 
+-------------+---------------+-----------+ 
| 3   | Citra   | 2   | 
+-------------+---------------+-----------+ 
| 4   | Doni   | 2   | 
+-------------+---------------+-----------+ 
| 5   | Erik   | 3   | 
+-------------+---------------+-----------+ 
| 6   | Gana   | 4   | 
+-------------+---------------+-----------+ 

тогда, если я выбираю, где employee_id 2, он также демонстрирует данные, как этот

+-------------+---------------+-----------+ 
| employee_id | employee_name | upline_id | 
+-------------+---------------+-----------+ 
| 2   | Budi   | 1   | 
+-------------+---------------+-----------+ 
| 3   | Citra   | 2   | 
+-------------+---------------+-----------+ 
| 4   | Doni   | 2   | 
+-------------+---------------+-----------+ 
| 5   | Erik   | 3   | 
+-------------+---------------+-----------+ 
| 6   | Gana   | 4   | 
+-------------+---------------+-----------+ 

, потому что в employee_id 2 у детей, у которых есть upline_id 2, тогда дети, у которых все еще есть upline, зацикливаются до тех пор, пока последние, у которых нет upline_id, будут такими же, как employee_id. Надеюсь, вы понимаете, извините, мой английский очень плохой.

если я выбираю employee_id 3 данные, показывающие, как этот

+-------------+---------------+-----------+ 
| employee_id | employee_name | upline_id | 
+-------------+---------------+-----------+ 
| 3   | Citra   | 2   | 
+-------------+---------------+-----------+ 
| 5   | Erik   | 3   | 
+-------------+---------------+-----------+ 

Я действительно не знаю, что я прошу, хехе

Postgre или MySQL

+2

Я смущен: -/hehe – 1000111

+1

Вы говорите, что у вас уже есть такой запрос? Или вам нужна помощь в написании? – sagi

+0

Это тоже мой вопрос @sagi – 1000111

ответ

0

модель вы принятые для хранения ваших иерархических данных, называются «смежным списком».

К сожалению, MySQL не поддерживает рекурсивные функции, поэтому, используя такую ​​модель, нужно было бы сделать самосоединение для каждого уровня иерархии, которую хотите пройти, но должно быть очевидно, что это не так, t - очень масштабируемое решение.

PostgreSQL, с другой стороны, это поддерживает рекурсивный CTEs, с которым вы можете сделать:

WITH RECURSIVE tree AS (
    SELECT id, name, ARRAY[]::INTEGER[] AS ancestors 
    FROM employees 
    WHERE upline_id = 0 

    UNION ALL 

    SELECT employees.id, employees.name, tree.ancestors || employees.upline_id 
    FROM employees JOIN tree ON employees.upline_id = tree.id 
) SELECT * FROM tree WHERE 2 = ANY(tree.ancestors) 

Однако, это может оказаться очень неэффективным для больших графов.

Чем лучше совет переделывать ваши данные, используя либо «вложенные наборы» или таблицу «транзитивного замыкания» вашего графика. @Bill Karwin Презентация, Models for Hierarchical Data in SQL and PHP - отличное объяснение/сравнение различных подходов.