首页 > 解决方案 > CONCAT with JOIN:每个 id 只创建一行,尽管 id 有多个行

问题描述

我正在使用MySQL.

我有以下示例架构:

CREATE TABLE `my_table1` (
  `id` int(5) NOT NULL,
  `column1` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `column2` varchar(255) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `my_table1` (`id`, `column1`, `column2`) VALUES
(1, 'George', 'something'),
(2, 'Peter', 'anything');

CREATE TABLE `my_table2` (
  `id` int(5) NOT NULL,
  `column1` varchar(255) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `my_table2` (`id`, `column1`) VALUES
(1, 'DDD'),
(1, 'HHH'),
(1, 'FFF'),
(2, 'LLL'),
(2, 'TTT');

我想将 的所有列合并my_table1到一个名为new_column. 此外,我还想将column1from合并my_table2new_columnwhere my_table1.id = my_table2.id

如果有多个行,my_table1.id = my_table2.idmy_table2想将它们全部合并到new_column同一行中。

因此,我的表格的预期输出如下:

ID 新列
1 乔治的东西 DDD HHH FFF
2 彼得任何东西 LLL TTT

我尝试了以下查询:

SELECT my_table1.id
     , CONCAT_WS(' ', my_table1.column1, my_table1.column2, my_table2.column1) AS new_column 
  FROM my_table1 
  LEFT 
  JOIN my_table2 
    ON my_table1.id = my_table2.id;

我得到以下结果:

ID 新列
1 乔治的东西 DDD
1 乔治的东西 HHH
1 乔治的东西 FFF
2 彼得任何东西 LLL
2 彼得什么都TTT

在这里你可以看到一个 MySQL fiddle。

我该怎么做才能收到预期的输出?

标签: mysqlsqlconcatenationleft-join

解决方案


这是一个JOINGROUP_CONCAT()

SELECT
    my_table1.id,
    CONCAT_WS (' ', my_table1.column1, my_table1.column2, GROUP_CONCAT(my_table2.column1 SEPARATOR ' ')) AS new_column
FROM my_table1
LEFT JOIN my_table2
    ON my_table1.id = my_table2.id
GROUP BY my_table1.id

这是工作查询的小提琴。


推荐阅读