mysql 分组排序前n + 长表转宽表
建表
CREATE TABLE if not EXISTS `bb` ( `id` int not null primary key auto_increment, `aab001` varchar(20) DEFAULT NULL COMMENT '参保组织编号', `aab003` varchar(20) DEFAULT NULL COMMENT '组织机构代码', `aae044` varchar(100) DEFAULT NULL COMMENT '单位名称', `pre_rs` decimal(8,0) DEFAULT NULL COMMENT '应缴人数', `cur_rs` decimal(8,0) DEFAULT NULL COMMENT '应缴人数', `rs` decimal(9,0) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; create table if not EXISTS aa as SELECT * from bb;
create table cc like aa;
表操作
# 改表名 rename table `aa` to `aaa`; ALTER TABLE cc RENAME TO orbit # 删表 drop table if exists tmp; # 更新字段 UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = 'M' # 删除行 DELETE FROM EMPLOYEE WHERE AGE > 20 # 插入数据 INSERT INTO cc SELECT * FROM orbit WHERE xttime > '2018-04-16 00:00:00' AND xttime <= '2018-04-17 00:00:00'; #分批插入
A、B两表,找出ID字段存在A表,但是不存在B表的数据。A表总共13w数据,去重后约3W条,B表有2W条,且B表的ID字段有索引
方法一:1.395秒 select distinct A.ID from A where A.ID not in (select ID from B) 方法二:0.739秒 select A.ID from A left join B on A.ID=B.ID where B.ID is null 方法三:0.570秒 select * from B where (select count(1) from A where A.ID = B.ID) = 0
长表转宽表
SELECT userkey, MAX(CASE tagid WHEN 1 THEN valueID ELSE NULL END) AS tag1, MAX(CASE tagid WHEN 2 THEN valueID ELSE NULL END) AS tag2 FROM userdata WHERE tagid IN (1 , 2) GROUP BY userkey
分组排序
--方法一: 该方法目前会报错,暂不知如何解决 select x,y,z from ( select x,y,z from a order by y desc limit 1000(大于总行数) ) t group by x --方法二:子查询 SELECT machine, deny_flow, total_flow, time FROM total_freq_ctrl A WHERE 1 > (SELECT COUNT(machine) FROM total_freq_ctrl WHERE machine = A.machine AND time > A.time) AND A.module = 'all' ORDER BY A.time desc; --方法三 set @row=0;set @mid=''; select a.*,b.rownum from total_freq_ctrl a inner join ( SELECT module, machine, time, case when @mid = machine then @row:=@row+1 else @row:=1 end rownum, @mid:=machine mid FROM total_freq_ctrl order by module,machine,time desc ) b on b.module=a.module and b.machine=a.machine and b.time=a.time where b.rownum<5; --改为下面的也可以 SET @R = 0; SET @mid = ''; SELECT * FROM ( SELECT test1.*, ( CASE WHEN @mid = a THEN @R := @R + 1 ELSE @R := 1 END ) AS rownum, @mid := a midnum FROM test1 ORDER BY a,b DESC ) t WHERE rownum < 2