查找并删除彼此紧靠的MySQL行重复项

时间:2018-07-09 13:10:47

标签: php mysql

我正在尝试查找并删除彼此紧靠的MySQL行重复项,而不是全部查找,即使它们并非紧随其后。

self.addEventListener('fetch', event => {
    console.log(event.request.url);
    event.respondWith(fetch(myRequest.clone()));
});

这是我当前的代码。但是,如果一张票证中只有两个相同的答案,而不必一个个接一个地存在,则这将找到重复项(如果您发送POST请求,失败并且刷新等,可能会发生这种情况)。

我该如何找到彼此只有1个ID的人。

因此找到1,2,3,4,5,6,7代替1,3,9,11

例如如果有

SELECT DISTINCT(content) AS contentMsg, COUNT(*) AS cnt, `ticketId`,`date` 
FROM ticketsReplies 
WHERE username = 'X' 
GROUP BY contentMsg, ticketId 
HAVING cnt > 1 
ORDER BY cnt DESC

如果有此名称,它将找到以下ID: 2,3,4,但不是9,因为它不是直接在4之后,即使它是重复的。

它也应该找到7,8,而不是1,因为它们彼此不对。

2 个答案:

答案 0 :(得分:1)

例如:

SELECT id 
  FROM 
     ( SELECT x.id  FROM my_table x JOIN my_table y ON y.email = x.email AND y.id = x.id + 1 ) a 
 UNION 
     ( SELECT y.id FROM my_table x JOIN my_table y ON y.email = x.email AND y.id = x.id + 1 );

答案 1 :(得分:0)

如果您的id列表中有空格(例如5, 6, 9, 11),则仅比较id = id+1是行不通的。我想出的解决方案是用顺序的行号创建两个相同的临时表。在这种情况下,即使ID之间有空格,您也可以根据行号安全地比较行。

DELETE FROM tab WHERE id IN (

SELECT A.id
FROM 
    (
    SELECT row_nr, id, email FROM (
        SELECT
            (@cnt1 := @cnt1 + 1) AS row_nr,
            t.id,t.email
        FROM tab AS t
          CROSS JOIN (SELECT @cnt1 := 0) AS d
        ORDER BY t.id
        ) x
    ) A
INNER JOIN 
    (
    SELECT row_nr, id, email FROM (
        SELECT
            (@cnt2 := @cnt2 + 1) AS row_nr,
            t.id,t.email
        FROM tab AS t
          CROSS JOIN (SELECT @cnt2 := 0) AS d
        ORDER BY t.id
        ) x
    ) B
ON A.row_nr-1 = B.row_nr AND A.email=B.email

)

两个(SELECT row_nr, id, email FROM ... ) x部分创建两个相同的表A和B,例如

row_nr   id  email
 1       1   aaa
 2       4   aaa
 3       5   bbb
 4       9   aaa
 5       11  aaa

然后,您可以比较连续的行号和电子邮件:

ON A.row_nr-1 = B.row_nr AND A.email=B.email

选择结果ID即可得到ID的4, 11,它们是重复项。然后,您可以删除这些ID:

DELETE FROM tab WHERE id IN ( ... )

这里是Fiddle,用于测试SELECT部分​​。

注意::在家里尝试之前,请备份您的桌子!