【问题标题】:Removing rows where all but one column match in MySQL删除 MySQL 中除一列外所有匹配的行
【发布时间】:2017-11-30 15:22:32
【问题描述】:

我有下表:

id | name  | time      | action | entered
---+-------+-----------+--------+--------
 1 | james | today     | x      |
 1 | james | today     | x      | yes
 1 | james | today     | y      |
 1 | james | today     | y      | yes
 2 | carl  | today     | x      | 
 2 | carl  | today     | y      |
 3 | casey | yesterday | x      |
 3 | casey | yesterday | x      | yes
 3 | casey | yesterday | y      |
 3 | casey | yesterday | y      | yes
 4 | john  | today     | x      | yes

我想删除entered 的值为“yes”的行,并且在除entered 之外的所有其他列中还有另一行具有相同的值。

在上面的示例中 - 应删除第 2、4、8、10 行。

所有五个列都有一个主键。

我怎样才能做到这一点? MySQL 或 Python 中的解决方案将被接受。

【问题讨论】:

  • 为什么第11行不应该被删除它也已经输入=“是”
  • @RaymondNijland 因为没有与其他值匹配的另一行..

标签: python mysql database


【解决方案1】:

试试这个:

DELETE t1
FROM tablename AS t1
JOIN (
  SELECT id, `name`, `time`, `action`, count(*) AS cnt
  FROM tablename
  GROUP BY id, `name`, `time`, `action`
  HAVING cnt > 1
) AS t2 ON t1.id = t2.id
AND t1.entered = 'yes'
;

只需将tablename 替换为您的表...

【讨论】:

  • 我错过了检查第 7 行
【解决方案2】:

我很有信心,我建议你在测试之前做一个备份......

DELETE x 
  FROM my_table x 
  JOIN my_table y 
    ON y.id = x.id
   AND y.name = x.name
   AND y.time = x.time
   AND y.action = x.action
   AND y.entered <> x.entered
 WHERE x.entered = 'yes';

【讨论】:

  • 这个解决方案对于大型数据集来说太重了..虽然没有在帖子中提到大小,
  • 在适当索引的架构上,这应该没问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多