如何摆脱MySQL

时间:2015-11-30 01:04:45

标签: mysql

我有一个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#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

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

1 个答案:

答案 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)';