【问题标题】:How to DELETE the NEXT row values that is going to match the PREVIOUS row values base on a 2 column in MySQL如何根据 MySQL 中的 2 列删除将与上一个行值匹配的下一个行值
【发布时间】:2017-07-08 06:10:25
【问题描述】:

我需要帮助,我想知道如何从 2 列中删除与 MySQL 表基上的前一行或列值匹配的下一行或列值。

因此,如果下一行/列值/结果包含与先前行/列值/结果相同的值,它将被删除,但如果下一列与前一列值/结果都不匹配,不应删除该行。该条件的正确查询是什么?

我正在尝试首先进行选择查询,以验证数据,这是我对选择的查询。我的查询是否适合选择?

SELECT current_row.row, current_row.id, current_row.column1,
       current_row.column2, previous_row.row, previous_row.id,
       previous_row.column1, previous_row.column2 
FROM 
   (SELECT  @rownum:=@rownum+1 row, a.*    
    FROM MyTable a, (SELECT @rownum:=0) r 
    ORDER BY unix_time, id 
   ) as current_row 

LEFT JOIN  
   (SELECT @rownum2:=@rownum2+1 row, a.*    
    FROM MyTable a, (SELECT @rownum2:=0) r
   ORDER BY unix_time, id) as previous_row 

ON (current_row.id = previous_row.id) 
AND (current_row.column1 = previous_row.column1) 
AND (current_row.column2 = previous_row.column2) 
AND (current_row.row = previous_row.row - 1) 
LIMIT 10;

非常感谢您的任何帮助!

干杯!

【问题讨论】:

  • mytable 中的ids 是否有漏洞和删除?你会尝试一遍又一遍地重复使用这个查询吗?
  • @MohaMad - 是的,基本上这个查询需要在 cron 作业或基本上在 bash 中运行。但是,我真的需要知道,我怎样才能基本上删除。
  • @MohaMad - 顺便说一句,目前没有删除 ID。
  • @Strawberry - 那么,您提供此链接是什么意思?您是否发现我提供的不是完整且可验证的示例来解决问题或给出我可以使用的正确答案? :)

标签: mysql sql


【解决方案1】:

我们正在尝试将select 数据与分配的新虚拟id 进行比较,因此ON 子句应为t1.myid=t2.myid+1WHERE 子句应过滤col1col2 行:

 SET @id1:=0 , @id2:=0 ;
 SELECT * FROM (
      (SELECT *, @id1:=@id1+1 as myid from mytable ) as t1
 LEFT JOIN
      (SELECT *, @id2:=@id2+1 as myid from mytable ) as t2
 ON  t1.myid = t2.myid + 1
 )
 WHERE t1.col1= t2.col1 and t1.col2 = t2.col2

对于DELETE 命令,您应该将结果保存在临时表中,然后删除其 id 存储在临时表中的行:

 SET @id1:=0 , @id2:=0 ;
 CREATE TEMPORARY TABLE tbl_ids AS 
 SELECT t1.id FROM ( -- t1.id returns NEXT row
      (SELECT *, @id1:=@id1+1 as myid from mytable ) as t1
 LEFT JOIN
      (SELECT *, @id2:=@id2+1 as myid from mytable ) as t2
 ON  t1.myid = t2.myid + 1 -- t1.myid > t2.myid
 )
 WHERE t1.col1= t2.col1 and t1.col2 = t2.col2 ;

 DELETE FROM mytable WHERE id in (SELECT * FROM tbl_ids) ;

【讨论】:

  • 让我试试看是否可行,顺便问一下,我在哪里可以删除?
  • 更改WHERE 行位置,因为我已更改答案中的代码。 @DatabaseAdmin
  • 回答中的第一个代码块,只是select 以您描述的方式重复行的所有字段。第二个代码块是危险的DELETE 命令。它找到id 并存储在tbl_ids 中,然后从主表中删除idtbl_ids 表中的行。 @DatabaseAdmin
  • WHERE id in (...) 用于搜索从(...) 中的内部SELECT 查询返回的数字数组中的id。
  • 在没有任何 ORDER BY 子句的情况下,这个答案是没有意义的。
猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多