【问题标题】:CONCAT with JOIN: create only one row per id although multiple rows for idCONCAT with JOIN:每个 id 只创建一行,尽管 id 有多个行
【发布时间】:2021-05-19 16:13:55
【问题描述】:

我正在使用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 的新列中。此外,我还想将column1my_table2 合并到new_column 其中my_table1.id = my_table2.id

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

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

id new_column
1 George something DDD HHH FFF
2 Peter anything 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 new_column
1 George something DDD
1 George something HHH
1 George something FFF
2 Peter anything LLL
2 Peter anything TTT

Here you can see a MySQL fiddle.

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

【问题讨论】:

  • 考虑处理应用代码中数据显示的问题,见meta.stackoverflow.com/questions/333952/…
  • @Strawberry 我的问题已经解决了,但我仍然想知道你到底是什么意思。从现在开始,我将在 SO 中使用表格,而不是来自phpMyAdmin 的屏幕截图。直到今天我才知道这是可能的。我用这些表格更新了我的问题。这是你的意思吗?
  • @Strawberry 我想我明白你的意思了:以后我会使用db-fiddle.com
  • @Strawberry 我再次更新了我的问题。这是现在正确的方法还是我还有什么需要改进的地方?
  • 我已重新格式化您的问题

标签: mysql sql concatenation left-join


【解决方案1】:

这是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

Here's a fiddle of the working query.

【讨论】:

  • 对我来说,这并没有改变任何东西,它是一样的。
  • @大卫。 . .我认为最后的大结果集是您的 desired 结果。您的问题很难理解,但我找到了预期的结果并修复了答案。
  • 如果有例如id=3 in my_table1id=3 in my_table2, id=3 根本不会出现在新创建的表/列中。为什么会这样?
  • @大卫。 . .因为JOIN 不匹配。需要的话可以切换到LEFT JOIN
猜你喜欢
  • 2017-11-23
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 2014-10-01
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多