2017-01-05 52 views
0

我正在實現一個功能,其中必須根據同一表的下一行中存在的值刪除當前行。在MySQL中水平自連接表當前行和下一行

我有列記錄:id,created_atmark

我需要刪除所有記錄,

WHERE currentrow.mark != nextrow.mark or (currentrow.mark = nextrow.mark and currentrow.created_at= '2000-01-01 00:00:00.000') 

即只與下一行的記錄沒有相同的標誌或下一行的記錄具有相同的標誌和created_at = '2000-01-01 00:00:00.000'

id  created_at     mark 
235 1990-01-01 00:00:00.000  5     /delete 
236 1990-01-01 00:00:00.000  5     /delete 
237 1990-01-01 00:00:00.000  5 
238 2016-10-10 23:45:40.000  5 


id  created_at     mark 
312 1990-01-01 00:00:00.000  8     /delete 
313 2016-01-09 18:00:00.000  6     
314 1990-01-01 00:00:00.000  4     /delete 
315 1990-01-01 00:00:00.000  7 
316 2016-10-10 23:45:40.000  7 

請幫助檢索表中的每一行在結果集中水平連接同一表的下一行。加入下一行

+4

定義'下一個'! – Strawberry

+0

您爲要刪除的記錄指定的條件以及示例數據中的值爲10年。這是什麼? – Bridge

+5

我可以看到在這個問題相同的示例數據http://stackoverflow.com/questions/41485396/deleting-record-in-sql-depending-on-next-record?noredirect=1#comment70176721_41485396。但是這被標記爲'sql-server' – Viki888

回答

2

我沒有完全理解刪除的條件。但我會回答你的最後一個問題 「請在結果集中水平地幫助檢索表中每行連接相同表的下一行。」

SELECT * FROM 
(SELECT (@rowid1 := @rowid1 + 1) firstSeq, id firsttableid, created_at firsttablecreated_at, mark firsttablemark FROM `mytable` 
JOIN (SELECT @rowid1 := 0) a) table1 
LEFT JOIN (SELECT (@rowid2 := @rowid2 + 1) secondSeq, id secondtableid, created_at secondtablecreated_at, mark secondtablemark FROM `mytable` 
JOIN (SELECT @rowid2 := 0) a) table2 ON table1.firstSeq = table2.secondSeq - 1 and **(your conditions)** 

這會根據您的需要爲您提供結果集。現在你可以添加你所需的條件轉換成刪除

+0

對我來說它有點複雜的理解,但這工作! –

+1

@SatishakumarAwati單獨進行內部查詢,執行並查看輸出。你可能會得到它。祝一切順利 – Akhil

1

一種方法是

INNER JOIN `tablename` AS `next` ON `next`.`id` = (
    SELECT MIN(id) FROM `tablename` WHERE `tablename`.`id` > `current`.`id` 
) 
AND (`next`.`mark` != `current`.`mark` 
    OR `next`.`created_at` = '2000-01-01 00:00:00.000') // maybe 1990? 
+0

這工作!沒有條件。 SELECT * from tablename a INNER JOIN tablename AS'next' ON'next'.'id' =( SELECT MIN(id)FROM'tablename' WHERE'tablename'.'id'>'a'.'id' ); –