Соединение и group_concat с тремя таблицами

Детали таблицы:

 CREATE TABLE `table1` (
    `user` VARCHAR(50) NULL DEFAULT NULL,
    `id` VARCHAR(50) NULL DEFAULT NULL
)
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
;

INSERT INTO `table1` (`user`, `id`) VALUES ('bob', '1');
INSERT INTO `table1` (`user`, `id`) VALUES ('bob', '2');
INSERT INTO `table1` (`user`, `id`) VALUES ('kev', '3');
INSERT INTO `table1` (`user`, `id`) VALUES ('kev', '4');

CREATE TABLE `table2` (
    `id` VARCHAR(50) NULL DEFAULT NULL,
    `data1` VARCHAR(50) NULL DEFAULT NULL,
    `data2` VARCHAR(50) NULL DEFAULT NULL
)
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
;

INSERT INTO `table2` (`id`, `data1`, `data2`) VALUES ('1', 'a', 'a1');
INSERT INTO `table2` (`id`, `data1`, `data2`) VALUES ('1', 'b', 'b1');
INSERT INTO `table2` (`id`, `data1`, `data2`) VALUES ('1', 'b', 'c1');
INSERT INTO `table2` (`id`, `data1`, `data2`) VALUES ('2', 'a', 'd1');
INSERT INTO `table2` (`id`, `data1`, `data2`) VALUES ('2', 'b', 'e1');
INSERT INTO `table2` (`id`, `data1`, `data2`) VALUES ('3', 'g', 'f1');

CREATE TABLE `table3` (
    `id` VARCHAR(50) NULL DEFAULT NULL,
    `data11` VARCHAR(50) NULL DEFAULT NULL,
    `data22` VARCHAR(50) NULL DEFAULT NULL
)
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
;

INSERT INTO `table3` (`id`, `data11`, `data22`) VALUES ('1', 'a10', 'a11');
INSERT INTO `table3` (`id`, `data11`, `data22`) VALUES ('1', 'b10', 'b11');
INSERT INTO `table3` (`id`, `data11`, `data22`) VALUES ('1', 'c10', 'c11');
INSERT INTO `table3` (`id`, `data11`, `data22`) VALUES ('2', 'd10', 'd11');
INSERT INTO `table3` (`id`, `data11`, `data22`) VALUES ('2', 'e10', 'e11');
INSERT INTO `table3` (`id`, `data11`, `data22`) VALUES ('3', 'f10', 'f11');

Мой проверенный запрос:

   select 
            t1.user,
            t1.id,
            group_concat(t2.data1 ) d1,
            group_concat( t2.data2) d2,
            group_concat( t3.data11 ) d11,
            group_concat(t3.data22 ) d22
        from table1 t1
        left join table2 t2 
                on   t2.id = t1.id
        left join table3 t3
                on t3.id = t1.id
                where t1.user='bob' group by t1.id;

но я получаю несколько данных в d1, d2, d11, d22 и из-за второго левого соединения

Ожидаемый результат:

+-------+------+------------+-----------+---------------+---------------+
|  user |   id |     d1     |     d2    |       d11     |     d22       |
+-------+------+------------+-----------+---------------+---------------+
|  bob  |   1  |   a,b,b    | a1,b1,c1  |  a10,b10,c10  |  a11,b11,c11  |
|  bob  |   2  |   a,b      | d1,e1     |  d10,e10      |  d11,e11      |
+-------+------+------------+-----------+---------------+---------------+

На самом деле я храню данные массива из API в MySQL, используя jdbc. Я вставил данные в три таблицы, теперь мне нужно извлечь эти данные, сформировать формат массива и отправить его в веб-API, так что кто-нибудь здесь знает, как это сделать? Нужно ли делать вложенный запрос?

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

agtabesh 26.07.2019 15:06

спасибо @agtabesh Я делаю больше успехов в правильном формате вопросов, это ясно

Santhosh 26.07.2019 15:20

См. GROUP_CONCAT - хотя я бы обрабатывал такие вещи в коде приложения.

Strawberry 26.07.2019 15:52

Как указано выше, серьезно рассмотрите возможность решения проблем с отображением данных в коде приложения.

Strawberry 30.07.2019 12:12
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
4
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

SELECT t1.id
     , GROUP_CONCAT(t2.data ORDER BY t2.data) x
  FROM Table1 t1 
  LEFT 
  JOIN Table2 t2 
    ON t2.id = t1.id 
 GROUP 
    BY t1.id;
+----+----------+
| id | x        | 
+----+----------+
| 15 | A1,B1,C1 |
| 16 | H        |
| 17 | NULL     |
+----+----------+

Спасибо Strawberry, на самом деле он работает с двумя только что найденными таблицами, если я добавлю еще одну левую, как показано в моем коде приложения, значение таблицы x a1,b1,c1,a1,b1,c1 возвращается два раза, как это, я загружу ошибку в новый.

Santhosh 26.07.2019 17:00

Круто - помните, что когда участники начнут замечать ваши результаты голосования, они могут не захотеть помочь в будущем.

Strawberry 30.07.2019 12:13
Ответ принят как подходящий
SELECT t1.user,
       t1.id,
       t2.d1,
       t2.d2,
       t3.d11,
       t3.d22
       FROM table1 t1
            LEFT JOIN (SELECT t2.id,
                              group_concat(t2.data1) d1,
                              group_concat(t2.data2) d2
                              FROM table2 t2
                              GROUP BY t2.id) t2
                      ON t2.id = t1.id
            LEFT JOIN (SELECT t3.id,
                              group_concat(t3.data11) d11,
                              group_concat(t3.data22) d22
                              FROM table3 t3
                             GROUP BY t3.id) t3
                      ON t3.id = t1.id
      WHERE t1.user = 'bob';

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