MySql的批量插入批量更新以及分组取最大值

1,为了演示,随便创建的两个表,用户表uesr,东区用户表user_east:

     CREATE TABLE USER(
        id INT(10) NOT NULL AUTO_INCREMENT,
        table_id INT(4) NOT NULL,
        NAME VARBINARY(20)  NOT NULL,
        address VARBINARY(20) NOT NULL,
        pv INT(10) DEFAULT 0,
        PRIMARY KEY(id)
        ) DEFAULT CHARSET = utf8;
     CREATE TABLE user_east(
        id INT(10) NOT NULL AUTO_INCREMENT,
        NAME VARBINARY(20) NOT NULL,
        address VARBINARY(20) NOT NULL,
        pv INT(10) DEFAULT 0,
        PRIMARY KEY(id)
        )DEFAULT CHARSET = utf8;

《MySql的批量插入批量更新以及分组取最大值》

2 user表批量插入数据:

   insert into user(table_id,name,address,pv) values
    (1,'张三','东区',44),
    (2,'李四','西区',66),
    (1,'王五','东区',33),
    (2,'吴磊','西区',55),
    (1,'花千骨','东区',55),
    (3,'张小凡','南区',30),
    (3,'白青龙','南区',50);

《MySql的批量插入批量更新以及分组取最大值》

3..按区域找出该区域流量pv最大的记录
group by 默认得到该组出现的第一条记录
《MySql的批量插入批量更新以及分组取最大值》
只要将最大的作为第一条记录即可

SELECT * FROM (SELECT * FROM USER ORDER BY pv DESC) AS u GROUP BY u.table_id;

《MySql的批量插入批量更新以及分组取最大值》
方法很多,我个人认为这种比较简单好理解。
那么如何按照分组取出每组最大的前两项了?(广大朋友们先思考)

4 将user表东区的数据插入用户东区表:
添加user_east表的时候忘记了个字段user_id,这里加上,后面更新的时候要用到

ALTER TABLE user_east ADD COLUMN user_id INT(10) NOT NULL AFTER pv;

《MySql的批量插入批量更新以及分组取最大值》
注意不要加括号。

INSERT INTO user_east(NAME,address,pv,user_id)  SELECT NAME,address,pv,id FROM USER WHERE table_id = 1;

5 批量同步更新user表的pv和对应的user_east的pv字段,都加1.
大家先看一个不是左右链接链接查询的列子:
《MySql的批量插入批量更新以及分组取最大值》
大家可以join left on查询来看,就会有数据了。为空的部分都是null。

UPDATE USER u1,user_east u2 SET u1.pv = u1.pv*10,u2.pv=u1.pv*10 WHERE u2.user_id = u1.id AND u1.table_id = 1;

《MySql的批量插入批量更新以及分组取最大值》
在mysql的官网中,没有找到这样的实列,我在开发的过程中用到了,特别注意的是,set前后根据where过滤后必须是一对一的关系,一对多的更新直接造
成表行级锁锁定,还有就是事务的配置,执行改操作过程并未错误,接下来执行的只是查询语句错误,报错了更新语句事务无法回退的问题。所以用得要慎重。

有错误,请指出来,一起讨论,谢谢。

点赞