上周这一直困扰着我,凭借基本知识,我根本无法找到一个解决方案来帮助我们达到我们需要的目标。我搜索了更新、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`;
最佳答案
如果您确实必须这样做,这可能是最直接的方法。
CREATE TABLE `db`.`temp`
SELECT `id`, GROUP_CONCAT(`value` SEPARATOR '|') AS `value`
FROM `db`.`table`
GROUP BY `id`;
TRUNCATE TABLE db.table;
INSERT INTO `db`.`table`(`id`, `value`)
SELECT `id`, `value`
FROM `db`.`temp`
;
DROP TABLE `db`.`temp`
当然,如果还有其他字段,您必须适当考虑它们以防止数据丢失。 您还可以将 temp
表设为真正的 TEMPORARY
表,但如果您在截断和重新插入之间失去连接,您将丢失所有数据。/em>
编辑:还要确保value
字段可以保存最长的GROUP_CONCAT()结果。
关于mysql - 连接具有共同重复键的字段并删除那些重复的字段,留下一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37757566/