【问题标题】:mysql search for duplicates by column A and delete by criteria on othe columnsmysql按A列搜索重复项并按其他列的条件删除
【发布时间】:2017-08-30 08:31:47
【问题描述】:

我有一个 mysql 数据库,其中包含一个包含以下列的表:PartCode、Price 和 Quantity。目标是编写一个查询,该查询将搜索具有重复“PartCode”的行,然后按价格和数量进行比较,并删除具有较高“价格”值的行,但如果“数量”之一为 0,则删除数量为 0 的那个。

A sample table would look like this:  
PartCode  -  Price  -  Quantity
 ABCD     -    5    -     2
 CDEF     -    6    -     1
 CDEF     -    4    -     1
 VZXY     -    8    -     4
 VZXY     -    7    -     0
 ....     -   ...   -    ...

And for the results, I'd like to get this:
PartCode  -  Price  -  Quantity
 ABCD     -    5    -     2
 CDEF     -    4    -     1
 VZXY     -    8    -     4
 ....     -   ...   -    ...

我找到了接收所有重复 PartCode 的解决方案:

SELECT `PartCode` FROM `Table` GROUP BY `PartCode` HAVING COUNT(*) > 1

我无法弄清楚的是如何通过其他列比较来实现它以删除其中一个重复项。

提前致谢。

【问题讨论】:

    标签: mysql duplicates criteria


    【解决方案1】:

    以下查询将从每个PartCode 组中删除一条具有最高数量的记录,或者如果一条记录的数量为零,则将其删除。

    DELETE
    FROM yourTable t1
    WHERE (PartCode, Quantity) IN
    (
        SELECT
            t.PartCode,
            t.qty
        FROM
        (
            SELECT
                PartCode,
                CASE WHEN MIN(Quantity) = 0 THEN MIN(Quantity) ELSE MAX(Quantity) END AS qty
            FROM yourTable
            GROUP BY PartCode
            HAVING COUNT(*) > 1
        ) t
    )
    

    【讨论】:

    • 感谢您的快速回复,但由于我是初学者,我有一些后续行动。一方面,我在第一个“t1”处收到错误,我不完全理解。其次,据我了解,带有数量的“CASE WHEN”部分选择了更高的数量,我最终应该得到将这些重复行混合为一个的结果,而我只想删除该行,而不符合我的标准(我在最初的问题中没有澄清这一点)。第三,如果将来我会有两个以上的重复,逻辑应该如何改变?再次感谢!
    • @Paulius 艰难的查询,我的第一种方法是错误的,请尝试我的更新。
    • 所以经过几次尝试,我删除了“t1”并发现,SQL 给出了一个错误,因为我想从第 8 行稍后调用的同一个“yourTable”中删除。当我改变第 2 行中的 "yourTable" 到另一个表,并且仅在第 8 行中引用了 "yourTable",它通过了。有没有办法解决这个问题?或者我应该创建一个重复的表,只是为了执行这个查询?我得到的错误是:“#1093 - You can't specify target table 'MergedData' for update in FROM 子句”
    • 现在它工作得很好。从这里开始,我相信我也可以通过“价格”调整过滤器,但有趣的是,在我的示例表中,我有 50 个重复的 PartCode,但是您的脚本删除了 51 个条目,仍然留下一个 PartCode复制。我检查了一下,剩余的重复项仍然存在,因为最初似乎有三个条目具有相同的 PartCode。应如何修改代码以容纳两个以上的匹配条目?或者也许我应该再次运行查询,直到不再有重复项?
    • 您想始终只留下一个条目吗?或者,在 3 部分重复记录的情况下,您是否只想删除一条记录,留下 2 条?
    猜你喜欢
    • 2022-11-10
    • 2014-12-28
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多