mysql - 连接具有共同重复键的字段并删除那些重复的字段,留下一个

标签 mysql database duplicates concatenation mysql-workbench

上周这一直困扰着我,凭借基本知识,我根本无法找到一个解决方案来帮助我们达到我们需要的目标。我搜索了更新、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 ;

在连接所需的值后,我们如何进行(UPDATEDELETE)查询来删除重复项?因为,使用 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/

相关文章:

mysql - 从面包屑/树路径获取项目(邻接模型)

java - 从 jtextfield java GUI 将值插入到 mysql 表中

javascript - 我们如何在 RethinkDb 中的过滤器之后使用 getNearest 函数?

windows - 用于删除重复行但想忽略/跳过某些行的批处理脚本

MYSQL 选择所有值最高的地方

php - 根据相应行使用递增值进行更新

database - 哪个更好? - 每次查询数据库或将对象保持在 session 中

database - Google Chrome 应用程序的 Google Chrome 数据库的大小限制是多少?

SQL 查询 - 如果重复项超过 3 个,是否删除重复项?

list - 从列表中删除重复项(在 vim 中)