我正在尝试查找并删除彼此紧靠的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,因为它们彼此不对。
答案 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部分。
注意::在家里尝试之前,请备份您的桌子!