【问题标题】:How to concatenate strings into a new column based on GROUP BY如何根据 GROUP BY 将字符串连接成新列
【发布时间】:2017-07-26 19:35:36
【问题描述】:

我有一个与 How to use GROUP BY to concatenate strings in MySQL? 类似的问题,但是对于 mytable 表的这个示例

id    string    aggr
1          A    NULL
1          B    NULL
2          F    NULL

不同的是我需要更新表格才能得到这个结果:

id    string   aggr
1          A   A|B|
1          B   A|B|
5          C   C|E|C|
5          E   C|E|C|
5          C   C|E|C|
2          F   F|

结果相同的id 我们有相同的newcolumn 值。

在字符串的最后添加分隔符| 绝对没问题。这样我就可以更快地计算newcolumn 中有多少“项目”,而无需添加+1,因为最后没有(就在两者之间)。此外,在将另一部分或两部分附加到 aggr 列时,我不会关心验证(如果我之前有一个管道)。

谢谢。

【问题讨论】:

  • 您真的需要更新表格,还是只在视图中显示结果?您可以使用 group_concat 将多行合并为 1,并实际使用 count 函数来计算给定 ID 的字符串数。
  • 是的,我需要更新一个表。是的,我知道该表将包含冗余数据。

标签: php mysql string concatenation aggregate


【解决方案1】:

你可以试试这个查询:

UPDATE my_table t
SET aggr = (
    SELECT * FROM (
        SELECT CONCAT(GROUP_CONCAT(t2.string SEPARATOR '|'), '|')
        FROM my_table t2
        WHERE t2.id = t.id
   ) AS X
)

【讨论】:

  • 抱歉,我收到一个 SQL 错误 (1093):表“t”被指定了两次,既作为“更新”的目标,又作为数据的单独源。
  • 你能给我你运行的查询吗?
  • 和你的一样(用这些列名创建了一个 my_table 表)。谢谢。
【解决方案2】:

你可以在原始表上加入一个 group_concat

select a.id, a.string ,  b.aggr
from my_table a
inner join  (
  select id, group_concat(string SEPARATOR '|') as aggr
  from my_table 
  group by  id 
) b on a.id = b.id

【讨论】:

  • 对不起,它是 SELECT,但在问题中询问了 UPDATE。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-09-14
  • 2013-02-22
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2010-09-21
相关资源
最近更新 更多