mysql-常用特殊sql的使用总结
Posted 健康平安的活着
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql-常用特殊sql的使用总结相关的知识,希望对你有一定的参考价值。
一 重复数据的处理
1.1 使用表和数据的介绍
1.使用的是product_comment,商品评论表,表结构,以及语料,见下图
CREATE TABLE `product_comment` (
`comment_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '评论ID',
`product_id` int(10) unsigned NOT NULL COMMENT '商品ID',
`order_id` bigint(20) unsigned NOT NULL COMMENT '订单ID',
`customer_id` int(10) unsigned NOT NULL COMMENT '用户ID',
`title` varchar(50) NOT NULL COMMENT '评论标题',
`content` varchar(300) NOT NULL COMMENT '评论内容',
`audit_status` tinyint(4) NOT NULL COMMENT '审核状态:0未审核1已审核',
`audit_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '评论时间',
`modified_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
PRIMARY KEY (`comment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品评论表';
入库脚本
insert into product_comment VALUES(44,131071,1,34,'商品不好','商品tmd',1,now(),now())
insert into product_comment VALUES(45,131072,2,56,'商品好','商品tmd',1,now(),now())
insert into product_comment VALUES(46,131072,2,56,'商品好','商品tmd2',1,now(),now())
insert into product_comment VALUES(47,131073,3,56,'商品omg','商品omg2',1,now(),now())
insert into product_comment VALUES(48,131073,3,56,'商品omg','商品omg2',1,now(),now())
insert into product_comment VALUES(49,131073,3,66,'商品omg','商品omg2',1,now(),now())
insert into product_comment VALUES(51,131073,3,76,'商品omg','商品omg2',1,now(),now())
insert into product_comment VALUES(50,131074,2,66,'商品omg','商品omg2',1,now(),now())
3.样本语料
1.2 查询出重复数据
要求:查询出同一产品的同一商品的评论数据大于1条的数据
select product_id,order_id ,count(1) he from product_comment group by product_id,order_id having he>1
1.2 删除重复数据
要求:删除同一产品的同一商品的评论数据大于1的数据,且保留评论id最小的那条数据(即保留重复数据的第一条)
1.2.1 方式一
1.先查询出:同一产品的同一商品的评论数据大于1的重复数据,id不是最新的那些数据的comment_id
select a.*,b.* from product_comment as a join (
select product_id pid,order_id oid ,count(1) he,min(comment_id) comment_id from product_comment group by product_id,order_id having he>1
) as b on a.product_id=b.pid and a.order_id=b.oid and a.comment_id!=b.comment_id
2.根据comment_id进行删除
delete from product_comment where comment_id in (
select a.comment_id from product_comment as a,
(
select product_id pid,order_id oid ,count(1) he,min(comment_id) comment_id from product_comment group by product_id,order_id having he>1
) as b where a.product_id=b.pid and a.order_id=b.oid and a.comment_id!=b.comment_id
)
可以看到报错:不能从同一张表查询出数据,又同时删除,需要在做一下修改:
delete from product_comment where comment_id in (
select c.comment_id from
(
select a.comment_id from product_comment as a,
(
select product_id pid,order_id oid ,count(1) he,min(comment_id) comment_id from product_comment group by product_id,order_id having he>1
) as b where a.product_id=b.pid and a.order_id=b.oid and a.comment_id!=b.comment_id
) as c
)
需要查询的数据再裹一层,成为临时表。
1.2.2 方式二
1.先查询出:同一产品的同一商品的评论数据大于1的重复数据,id不是最新的那些数据的comment_id
select a.*,b.* from product_comment as a join (
select product_id pid,order_id oid ,count(1) he,min(comment_id) comment_id from product_comment group by product_id,order_id having he>1
) as b on a.product_id=b.pid and a.order_id=b.oid and a.comment_id!=b.comment_id
2.直接删除
delete a ...的语法;delete 后面直接跟表名
delete a from product_comment as a join (
select product_id pid,order_id oid ,count(1) he,min(comment_id) comment_id from product_comment group by product_id,order_id having he>1
) as b on a.product_id=b.pid and a.order_id=b.oid
and a.comment_id!=b.comment_id
查看表中的数据;
可以看到实现了去除重复数据的删除。
以上是关于mysql-常用特殊sql的使用总结的主要内容,如果未能解决你的问题,请参考以下文章