Выбрать все записи из таблицы отношений как массив на основе первичного ключа «родительской» таблицы

У меня есть такие таблицы:

Пользователи:

+----+--------+
| Id |  Name  |
+----+--------+
|  1 | Name 1 |
|  2 | Name 2 |
+----+--------+

Группа документов:

+----+-----------------+
| Id |       Name      |
+----+-----------------+
|  1 | Document name 1 |
|  2 | Document name 2 |
|  3 | Document name 3 |
+----+-----------------+

Группа документов пользователей:

+----+---------+--------------+
| Id | User_id |  Document_id |
+----+---------+--------------+
|  1 |       1 |            1 |
|  2 |       1 |            2 |
|  3 |       2 |            2 |
|  4 |       1 |            3 |
+----+---------+--------------+

Я хочу, чтобы результат выглядел так:

result = [
    1, "Name 1", ["Document name 1", "Document name 2", "Document name 3"]
    2, "Name 2", ["Document name 2"]
]

Проблема в том, что я даже не знаю, с чего начать ...

В настоящее время я анализирую много данных на стороне сервера и группирую / отображаю там (с использованием PHP), но проблема, которая у меня есть, заключается в том, что с большим набором данных это занимает много времени (около 10 секунд) ...

Есть ли способ создать такой запрос в MySQL?

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

Madhur Bhaiya 26.09.2018 16:42

Не уверен, какие результаты вы хотите получить, он выглядит как многомерный (PHP) массив.

Raymond Nijland 26.09.2018 16:42

Также совет: посмотрите на INNER JOIN между этими таблицами, чтобы получить свои данные.

Madhur Bhaiya 26.09.2018 16:43

Попробуйте использовать функцию GROUP_CONCAT.

Tano Fotang 26.09.2018 16:48

"MySQL будет генерировать данные только в табличной форме для вас" @MadhurBhaiya Не совсем верно. Я использовал MySQL раньше для создания "сложных" структур данных, таких как JSON или XML, в столбце таблицы. Вы даже можете сгенерировать сериализованный массив PHP из MySQL, если хотите и знаете структуру.

Raymond Nijland 26.09.2018 16:48

кстати, я предполагаю, что вместо этого должен быть $result = [ [1, "Name 1", ["Document name 1", "Document name 2", "Document name 3"]] , [2, "Name 2", ["Document name 2"]] ];?

Raymond Nijland 26.09.2018 16:56

@RaymondNijland о. это правильно. Я обновлю свой пост.

user3681563 26.09.2018 17:06
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
7
35
1

Ответы 1

Может как то так?

select 
    group_concat(concat(users.id, ',', concat('\"',users.name,'\"'), ',',  
concat('[',all_documents,']')), ';') 
    as final_result
from users
join 
    (
        select group_concat(concat('\"',documents.name,'\"')) 
        as all_documents,users.id
        from users_documents, users, documents
        where documents.id=users_documents.document_id and 
        users.id=users_documents.user_id
        group by users.id
    ) temp1 on users.id = temp1.id

Другие вопросы по теме