#mysql #sql
#mysql #sql
Вопрос:
У меня есть эти данные в MySQL, которые выглядят следующим образом (фактические данные отличаются, но я просто хочу упростить их)
Примечание: дочерний столбец — это JSON
SELECT id, name, children FROM people;
ID | Имя | дочерние элементы |
---|---|---|
2 | Джек | [«5», «3»] |
3 | Джон | Null |
5 | Сара | Null |
у дочерних элементов не может быть других дочерних элементов, дочерние элементы не могут находиться в другой таблице, потому что данные похожи, и мне нужны все люди сразу, и я не хочу получать доступ к базе данных для каждого дочернего элемента
Данные должны выглядеть так после ВЫБОРА:
ID | Имя | дочерние элементы |
---|---|---|
2 | Джек | [{‘id’: ‘5’, ‘name’: ‘Sara’},{‘id’: ‘3’, ‘name’: ‘John’}] |
3 | Джон | Null |
5 | Сара | Null |
возможно ли это, как я могу это сделать?
есть ли лучший способ сделать это (не в другой таблице)
Ответ №1:
Я бы предложил изменить макет вашей таблицы на отношения родитель-> потомок со столбцом parent_id.
Текущая компоновка смешивает строковые значения json со значениями целых столбцов. Когда таблица станет больше, вы, вероятно, тоже столкнетесь с проблемами производительности (пока только предположение).
Другой подход был бы:
https://www.db-fiddle.com/f/jbVqtZjZbmPAZ42S8A8fbT/1
CREATE TABLE people (id INT, name TEXT, parent_id INT);
INSERT INTO people (id, name, parent_id)
VALUES
(2,'Jack', Null),
(3,'John', 2),
(5,'Sara', 2)
;
SELECT p.id, p.name,
(SELECT JSON_ARRAYAGG(JSON_OBJECT('id', pc.id, 'name', pc.name)) FROM people pc
WHERE pc.parent_id=p.id) AS children
FROM people p