【发布时间】:2016-10-11 23:19:54
【问题描述】:
这在上周一直困扰着我,凭借基本知识,我根本无法找到将我们带到需要的地方的解决方案。我搜索了更新、group_concat、concat、joins,但我无法得到我们需要的结果。
问题如下:
我们使用 2 个列来获得我们需要的一个结果:
我们正在开发的数据库:
+------------------------------------+-------------+
| id | value |
+------------------------------------+-------------+
| D44172cb5c086c19a4c0286270916bc52 | A |
| D44172cb5c086c19a4c0286270916bc52 | C |
| D44172cb5c086c19a4c0286270916bc52 | B |
| D87d93570cbc9a3edc18601e0aff6e261 | D |
| D87d93570cbc9a3edc18601e0aff6e261 | A |
| D87d93570cbc9a3edc18601e0aff6e261 | F |
+------------------------------------+-------------+
我们期望得到的:
+-------------------------------------+-------------+
| id | value |
+-------------------------------------+-------------+
| D44172cb5c086c19a4c0286270916bc52 | A|C|B |
| D87d93570cbc9a3edc18601e0aff6e261 | D|A|F |
+-------------------------------------+-------------+
我们目前正在使用一个 SELECT 命令,该命令有效,并且在名为 valuenew 的临时(因为我们只选择)列中按预期提供数据:
SELECT * GROUP_CONCAT(value SEPARATOR '|') AS valuenew FROM db.table GROUP BY id ;
在连接所需值后,我们如何进行(UPDATE 或 DELETE)查询以删除重复项?因为,使用GROUP_CONCAT 返回的行数将少于实际存在的行数。
我们需要在稍后阶段将连接的值与其他列组合,因此行需要等于返回的行。
解决方案
CREATE TABLE IF NOT EXISTS `temp`
SELECT *, GROUP_CONCAT(`value` SEPARATOR '|') AS `values`
FROM `db`.`table`
GROUP BY `id`;
TRUNCATE TABLE `db`.`table`;
UPDATE `temp` SET value = values;
ALTER TABLE `temp` DROP COLUMN values;
INSERT INTO `db`.`table`([all column titles here])
SELECT *
FROM `db`.`temp`
;
DROP TABLE `db`.`temp`;
【问题讨论】:
-
这通常是个坏主意,有更多问题的最佳答案涉及撤消这种事情。
-
不要去规范化,除非你是 100% 永久不可撤销地完全确定你永远不必再将组件值作为单独的值来处理。
-
如果您不想在所有查询中都写
GROUP_CONCAT(),请定义一个VIEW来完成。 -
@MarcB 我们不需要数据,即使我们需要,我们也可以重新调用加载数据文件来恢复所有表。我们需要它,以便在此过程中进一步使用它。 @Barmar 这不是不想使用
GROUP_CONCAT,而是要使用一个查询,该查询还将删除它从中提取连接值的重复行。 -
@RkdL 表中有唯一的 ID 列吗?如果您真的想这样做,您需要一种一致的方式来决定将组合值放入哪一行以及应该删除哪些行。这需要另一列来区分每个组中的原始行。
标签: mysql database duplicates concatenation mysql-workbench