有时候 业务功能出现了问题,最后发现是数据有问题,此时我们需要进出现问题的数据查询出来,并根据查询的结果将重复数据进行处理。
举一个列子,有如下数据
id | from | to | time | workbench_id |
---|---|---|---|---|
1 | 345 | 543 | 156456456 | 3 |
2 | 345 | 543 | 1564651156 | 3 |
3 | 543 | 345 | 1564661651 | 3 |
比如上表的数据中,我们认为from
和to
以及workbench_id
一样的数据只能有一条,从业务上来说,由这三个字段确定一条唯一的数据,此时我们需要将数据库中类似id
为1和2这种不合法的数据给清除掉。首先我们需要将不合法的数据查询出来,查询语句如下
SELECT
*
FROM
(
SELECT *, CONCAT( `from`, `to`, workbench_id) AS fromToWorkbenchid
FROM chat_session
) t
WHERE
t.fromToWorkbenchid IN (
SELECT tt.fromToWorkbenchid
FROM (
SELECT *, CONCAT( `from`, `to`, workbench_id ) AS fromToWorkbenchid
FROM chat_session
) tt
GROUP BY fromToWorkbenchid
HAVING count( fromToWorkbenchid ) > 1
);
实际上就是将这三个字段使用CONCAT
链接起来作为一个新的字段使用,之后在此基础上进行下一步的查询。
要删除数据也是类似于上面的思路:
DELETE FROM chat_session
WHERE id NOT IN
(
SELECT maxid
FROM (
SELECT MAX(id) AS maxid, CONCAT(from, to, workbench_id)
AS fromToWorkbenchid
FROM chat_session
GROUP BY fromToWorkbenchid
) t
)