我有一个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
是一个unique
号码,由表格自动生成。 Quantity
是库存中的零件数量。 id#1
和id#95
是相同的部分,但id#95
是更新的信息 - 即意图替换/更新id#1
。在部件的末尾应该永远不会出现“(0 free)
”字符串 - 因此必须将其删除。对于id#2
和id#96
,情况也是如此。 id#97
是一个新的部分,我只需要在最后删除“(10 free)
”字符串。 id#3
和id#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
该列表将相对较短,因为附加的一些信息已更新之前的条目。
答案 0 :(得分:0)
这在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不允许您引用删除的表。因此,我认为您可以在substring_index()
中使用join
然后删除重复的行来查找重复项。首先,您要更新值:
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)';