这些年写过的花式sql - 第一句 删除重复无效的记录
写好复杂sql可以减少代码量,经过写这些年的后台统计,我学着像写代码一样的设计和尝试sql。现整理如下:
本来想一次性写完的,不过那写起来和看起来都太累了。还是分解一下吧。
如果有不对的或者可以优化的地方,欢迎指正。
第一句
需求:
表中有字段 用户名 username,状态 status(1,有效,-1无效)。因为以前的一些疏忽,导致部分username的记录超过1个而且有的状态是1(为1 的最多有一个),有些是-1。现在准备把 同时有1和-1的username记录整理一下,只保留状态为1的那条记录。
//删除重复无效的username对应的记录
delete
from `child_user`
where
username in
(SELECT username from ( SELECT username,count(*) as num FROM `child_user` group by username having num >1) a)
and status !=1
解析:
- 分析删除条件:【条件一】status !=1 ,且 【条件二】该username对应的记录不止一条。
对于条件二,可以分解:- 查询 username 不止一条的记录 ( SELECT username,count(*) as num FROM
child_user
group by username having num >1) - 把这个结果 起个表别名 a
- 提取其中的username列 即为 不止一条记录的username集合
- 查询 username 不止一条的记录 ( SELECT username,count(*) as num FROM
- 知识点:delete,group,in,中间结果集作表的转换: (sql)表别名。如果这个 临时结果需要被 “from”,一定要 括起来并加上别名。如果不是被from,目前看来是不要加的。这里加了甚至会出错。