2016-08-02 13 views
0

Это мой Mysql базы данныхПолучить иерархические данные из базы данных MySql

╔════╦═══════════╗ 
║ ID ║ Parent_ID ║ 
╠════╬═══════════╣ 
║ 1 ║   0 ║ 
╠════╬═══════════╣ 
║ 2 ║   1 ║ 
╠════╬═══════════╣ 
║ 3 ║   1 ║ 
╠════╬═══════════╣ 
║ 4 ║   3 ║ 
╠════╬═══════════╣ 
║ 5 ║   4 ║ 
╚════╩═══════════╝ 

То, что я хочу добиться:

При выполнении поиска пользователя для ID 1, я хочу, чтобы получить все те элементы, чьи Parent_ID - это 1, а также все те ID, у которых есть как их родитель или великий родитель или великий родитель и так далее.

или просто все потомки ID 1.

Пример:

  1. , если поиск пользователей для 1, алгоритм должен давать результата
    {2,3,4, 5} - 4,5, потому что 1 - их великий великий родитель.

  2. , если поиск пользователей для 2, алгоритм должен давать пустой результат {} как ни один элемент не имеют 2 как parent_id

  3. , если поиск пользователей для 3, алгоритм должен дать результат {4,5} - - 5, потому что 3 - его великий родитель.

Что такое хороший способ сохранения и извлечения этих типов данных из базы данных?

Я использую Java и MySQL.

Спасибо.

+2

Этот вопрос в нем присутствует форма является слишком широкой. Я рекомендую прочитать это: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ – e4c5

+0

@DavidWallace ... или 4 в этом отношении. –

+0

@DavidWallace OP не знал, что он должен быть рекурсивным, поэтому вопрос – Joanvo

ответ

1

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

Этот ответ может помочь вам: https://dba.stackexchange.com/questions/30021/mysql-tree-hierarchical-query

[Редактировать]

Если вы всегда запросить для корневого родителя (т.е. строки, которые могут иметь детей, но не имеет родителя), вы можете хранить что идентификатор в каждой строке и запрос по этому столбцу:

╔════╦═══════════╦════════════════╗ 
║ ID ║ Parent_ID ║ Root_Parent_ID ║ 
╠════╬═══════════╬════════════════╣ 
║ 1 ║   0 ║    1 ║ 
╠════╬═══════════╬════════════════╣ 
║ 2 ║   1 ║    1 ║ 
╠════╬═══════════╬════════════════╣ 
║ 3 ║   1 ║    1 ║ 
╠════╬═══════════╬════════════════╣ 
║ 4 ║   3 ║    1 ║ 
╠════╬═══════════╬════════════════╣ 
║ 5 ║   4 ║    1 ║ 
╠════╬═══════════╬════════════════╣ 
║ 6 ║   0 ║    6 ║ 
╠════╬═══════════╬════════════════╣ 
║ 7 ║   6 ║    6 ║ 
╠════╬═══════════╬════════════════╣ 
║ 8 ║   7 ║    6 ║ 
╚════╩═══════════╩════════════════╝ 

Тогда вы можете просто запрос: SELECT * FROM mytable WHERE Root_Parent_ID = 1

В противном случае, я рекомендую вам пойти более подробно о том, как более эффективно хранить эти данные: https://blogs.msdn.microsoft.com/anthonybloesch/2006/02/15/hierarchies-trees-in-sql-server-2005/

+0

Благодарим вас за то, что вы нашли время для ответа на вопрос. –

+0

во время ввода данных в таблицу sql, У меня только два идентификатора информации и Parent_ID. Так вы предлагаете, я создаю столбец Root_Parent_ID и вставляю Root_Parent_ID во время создания каждой строки. –

+0

и как получить потомков элемента, скажем, ID = 3. i.e {4,5} как {3-> 4, 4-> 5}. Получая список потомков 3, я не хочу, чтобы список его родителей, великих родителей. –

Смежные вопросы