gpt4 book ai didi

mysql - 如何从 MySQL 中删除相似的重复项

转载 作者:行者123 更新时间:2023-11-30 22:30:37 25 4
gpt4 key购买 nike

我有一个 MySQL PHPMyAdmin 数据库,我不小心在其中附加了两个相同的部分。对我来说,它们是重复的,但就实际数据而言,它们不是。 part_lists 表中有更多的列:

+-----+---------------------------+----------+
| id | Part Name | Quantity |
+-----+---------------------------+----------+
| 1 | Part A (1/4") | 0 |
| 2 | Part B | 3 |
| 3 | Part D | 4 |
| 4 | Part E | 9 |
| ... | a lot of part names later | ... |
| 95 | Part A (1/4") (0 free) | 4 | <-- newly appended
| 96 | Part B (-1 free) | 5 | <-- newly appended
| 97 | Part C (10 free) | 1 | <-- newly appended

表格说明:

id 是一个唯一 数字,由表格自动生成。 Quantity 是库存零件的数量。 id#1id#95 是同一部分,但 id#95 是更新的信息 - 即旨在替换/更新 id#1。该部分的末尾不应该有“(0 free)”字符串,因此必须将其删除。 id#2id#96 也是如此。 id#97 是一个新部分,我只需要去掉末尾的“(10 free)”字符串。 id#3id#4 是没有更新的旧部分,因此应该保持原样。

问题:我附加的大部分(不是全部)新部分都有一个“([some number] free)”字符串附加到 Part 的末尾。有时这些部分是唯一的(即没有重复)。 问: 我如何去除重复项,但确保信息已更新。 问: 这可以用 MySQL 代码完成吗?如果不是,我将如何使用 bash 执行此操作!?

理想输出:

+-----+---------------------------+----------+
| id | Part Name | Quantity |
+-----+---------------------------+----------+
| 1 | Part A (1/4") | 4 | <-- Updated
| 2 | Part B | 5 | <-- Updated
| 3 | Part D | 4 |
| 4 | Part E | 9 |
| ... | a lot of part names later | ... |
| 95 | Part C | 1 | <-- newly appended

该列表将相对较短,因为附加的一些信息已经更新了之前的条目。

最佳答案

这在 MySQL 中有点痛苦。标准 SQL 将使用 exists:

delete t
from t
where partname like '%(% free)' and
not exists (select 1 from t t2 where t2.name like concat(t.name, '(% free)'));

或者一些类似的逻辑。但是,MySQL 不允许您引用您被删除的表。因此,我认为您可以通过在 join 中使用 substring_index() 然后删除重复的行来找到重复项。不过,您首先要更新值:

update t join
t tfirst
on tfirst.id < t.id and
substring_index(t.partname, ' (', 1) = tfirst.partname and
t.partname like '% (% free)'
set tfirst.quantity = tfirst.quantity + t.quantity;

请注意,此公式仅适用于一个副本。如果有多个,则将选择任意一个进行更新。

然后你可以删除重复的:

delete t
from t join
t tfirst
on tfirst.id < t.id and
substring_index(t.partname, ' (', 1) = tfirst.partname and
t.partname like '% (% free)';

然后,您要更新剩余“c”记录的零件名称:

update t
set partname = substring_index(t.partname, ' (', 1)
where t.partname like '% (% free)';

关于mysql - 如何从 MySQL 中删除相似的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33990054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com