Intereting Posts
Как выбрать максимум 3 элемента для каждого пользователя в MySQL? Преобразуйте dbnull в строку. Запись dbnull.value в базе данных вместо Nothing Строить строку SQL Connection со встроенной безопасностью для использования через VPN? При использовании DbSet <T> .SqlQuery (), как использовать именованные параметры? Как изменить настройку таблицы по умолчанию? Выберите строки, отсутствующие в другой таблице. Как вы делаете много для многих внешних внешних таблиц? Существует ли общий дизайн баз данных уличных адресов для всех адресов мира? это блокирует базу данных? Получение бит из SqlServer в c # Spring JPA – параметр с этой позицией не существует План выполнения SQL-запросов хранимой процедуры Перенос SQL хранимых значений DateTime в наилучшую практику DateTimeOffset? Требуется ли ключевое слово 'as' в Oracle для определения псевдонима? В SQL как разбить выделение строки, которой нет ia table?

лица, в которых дети сгруппированы для своих родителей

У меня есть база данных SQLite с простой таблицей Лица.

Каждая строка представляет человека и имеет четыре столбца: первичный ключ (id), один для имени, один для возраста и один для родителя (указывает на идентификатор primkey, равен NULL, если у человека нет родителя).

Теперь я просто хочу перечислить всех тех людей, которые были отсортированы по возрасту, и иметь детей, сгруппированных с родителями.

Например: (имя, возраст)

 Дэн, 18
 Ева, 21
 - Билл, 4
 - Бык, 7

 Стив, 38
 Ричард, 63
 - Энн, 19
 - Клара, 39

 Вера, 70  

Это звучит просто, но я не могу понять инструкцию SQL 🙁
Заранее спасибо!

/ John

Я рекомендую вам разбить это на два запроса.

Сначала получите список родителей:

SELECT * FROM Persons WHERE id IN (SELECT parent FROM Persons) ORDER BY (age, id) 

Затем получите правильно отсортированный список детей:

 SELECT Child.* FROM Persons AS Child JOIN Persons AS Parent ON (Parent.id = Child.parent) ORDER BY (Parent.age, Parent.id, Child.age, Child.id) 

Эти два списка затем могут быть легко объединены в id / parent так как они сначала сортируются по age родителей.

Если вам нужен только один уровень глубины, вы можете сделать это следующим образом:

 SELECT CONCAT(CASE WHEN parent IS NOT NULL THEN '- ' ELSE '' END, name), age FROM table ORDER BY CASE WHEN parent IS NOT NULL THEN parent ELSE id END, parent IS NOT NULL 

Если вы хотите построить целую иерархию, это сложнее.

Обновление: вначале тег вопроса сказал MySQL , поэтому ответ относится к MySQL .

Я оставлю ответ, но он не будет работать для SQLite .

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

См. Эту статью в своем блоге:

  • Иерархические запросы в MySQL

В двух словах:

 CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INT NOT DETERMINISTIC READS SQL DATA BEGIN DECLARE _id INT; DECLARE _parent INT; DECLARE _next INT; DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL; SET _parent = @id; SET _id = -1; IF @id IS NULL THEN RETURN NULL; END IF; LOOP SELECT MIN(id) INTO @id FROM t_hierarchy WHERE parent = _parent AND id > _id; IF @id IS NOT NULL OR _parent = @start_with THEN SET @level = @level + 1; RETURN @id; END IF; SET @level := @level - 1; SELECT id, parent INTO _id, _parent FROM t_hierarchy WHERE id = _parent; END LOOP; END SELECT CONCAT(REPEAT(' ', level - 1), CAST(hi.id AS CHAR)) AS treeitem, parent, level FROM ( SELECT hierarchy_connect_by_parent_eq_prior_id(id) AS id, @level AS level FROM ( SELECT @start_with := 0, @id := @start_with, @level := 0 ) vars, t_hierarchy WHERE @id IS NOT NULL ) ho JOIN t_hierarchy hi ON hi.id = ho.id