mysql批量更新数据

k851590063 2017-12-19 04:36:44
根据查询出的数据分组按照时间降序更新数据

如图:
现在想把小明sort=1,小红sort=2,小强sort=1
请问要怎么写sql才能实现
...全文
304 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
k851590063 2017-12-20
  • 打赏
  • 举报
回复
引用 2 楼 ckc 的回复:
mysql> select * from a; +------+------+---------------------+------+ | id | name | d | sort | +------+------+---------------------+------+ | 1 | 小明 | 2017-12-20 07:33:02 | NULL | | 3 | 小强 | 2017-12-20 07:33:19 | NULL | | 2 | 小红 | 2017-12-20 07:33:30 | NULL | +------+------+---------------------+------+ update a a1 set sort=(select count(*) from (select * from a) a2 where a2.d<a1.d)+1; select * from a; +------+------+---------------------+------+ | id | name | d | sort | +------+------+---------------------+------+ | 1 | 小明 | 2017-12-20 07:33:02 | 1 | | 3 | 小强 | 2017-12-20 07:33:19 | 2 | | 2 | 小红 | 2017-12-20 07:33:30 | 3 | +------+------+---------------------+------+ 注意mysql的子查询有点怪异,直接用 update a a1 set sort=(select count(*) from a a2 where a2.d<a1.d) 会报错:ERROR 1093 (HY000): You can't specify target table 'a1' for update in FROM clause 所以要多套一层 另外用date做字段名是比较有问题的作法
还要根据group_id分组 小明和小红的group_id是一样的,根据时间升序设置sort,小强的group_id和其他人的group_id不一样所以他的sort=1 一定要先分组在根据时间
k851590063 2017-12-20
  • 打赏
  • 举报
回复
引用 1 楼 wandier 的回复:
更新成1 2的逻辑关系是什么,固定的名称对应?
根据group_id分组之后在根据时间升序查询出来的结果设置sort
zjcxc 2017-12-20
  • 打赏
  • 举报
回复
CREATE TABLE table1(id int, name varchar(10), date datetime, sort int)
AS
SELECT 1 as id, 'aa' as name, '2017-12-1 17:00' as date UNION ALL
SELECT 2 as id, 'BB' as name, '2017-12-2 18:00' as date UNION ALL
SELECT 3 as id, 'CC' as name, '2017-12-1 13:00' as date
;
UPDATE table1 A, (
	SELECT id, sort FROM(
		SELECT
			@id := CASE WHEN TIMESTAMPDIFF(day, @dt, date) = 0 THEN @id ELSE @id+1 END as sort,
			@dt := date,
			id
		FROM table1, (SELECT @dt:=NULL, @id:=0) x
		ORDER BY date
	)B
) B 
SET A.sort = B.sort
WHERE A.id = B.id
;
SELECT * FROM table1;
zjcxc 2017-12-20
  • 打赏
  • 举报
回复
order by date , 相同日期使用相关的 sort ?
ckc 2017-12-20
  • 打赏
  • 举报
回复
mysql> select * from a; +------+------+---------------------+------+ | id | name | d | sort | +------+------+---------------------+------+ | 1 | 小明 | 2017-12-20 07:33:02 | NULL | | 3 | 小强 | 2017-12-20 07:33:19 | NULL | | 2 | 小红 | 2017-12-20 07:33:30 | NULL | +------+------+---------------------+------+ update a a1 set sort=(select count(*) from (select * from a) a2 where a2.d<a1.d)+1; select * from a; +------+------+---------------------+------+ | id | name | d | sort | +------+------+---------------------+------+ | 1 | 小明 | 2017-12-20 07:33:02 | 1 | | 3 | 小强 | 2017-12-20 07:33:19 | 2 | | 2 | 小红 | 2017-12-20 07:33:30 | 3 | +------+------+---------------------+------+ 注意mysql的子查询有点怪异,直接用 update a a1 set sort=(select count(*) from a a2 where a2.d<a1.d) 会报错:ERROR 1093 (HY000): You can't specify target table 'a1' for update in FROM clause 所以要多套一层 另外用date做字段名是比较有问题的作法
wandier 2017-12-20
  • 打赏
  • 举报
回复
更新成1 2的逻辑关系是什么,固定的名称对应?
db服务器连接mysql+redis高可用高性能框架干货1、使用c++语言,vs2019开发垮平台[windows和linux]连接MySql和redis框架。2、使用MySql持久化玩家数据,redis做玩家数据缓存层,redis不做数据持久化。mysql搭配redis工作效率非常高效,就好比男女搭配干活不累,没有redis,mysql也能独立很好的完成用户读写请求。有了redis,用户访问数据的效率更高,时间更短,快速的完成请求。3、讲解如何保持mysql和redis数据强一致性策略,并在代码里实现。每次启动redis,使用管道技术,从mysql批量导入活跃用户数据到redis中,并设置过期时间.4、教程使用线程池技术,每个线程拥有自己独立的数据,线程绑定类。每一个实例就包含一个线程每个线程数据里包含:mysql连接器、redis连接器、内存回收池、安全的串行队列、条件变量、互斥量保证线程内的数据安全。5、工作原理:没有请求时,各个工作线程处于休眠状态。有读写请求时,从线程池获取一个线程,添加读写请求,把数据推送到线程工作队列中。然后工作线程获取队列的数据,进行串行工作任务安排,进行mysql数据库读写操作,以及redis读写数据操作,当完成工作任务时,执行下一个工作任务,同时把处理结果推送到逻辑线程,把数据给用户。6、用户读数据策略:用户获取数据首先是先从redis查找数据,redis命中,返回数据给玩家,redis命中失败,mysql中查找数据,然后写入数据到redis中,返回数据给用户。7、用户写数据策略:用户先从redis中删除数据,然后写数据mysql中,最后再把数据写入到redis中,保持数据一致性。8、教程是一个干货教程,不是新手教程,mysql基础语法讲解的少,redis有讲解基础系列。教程讲解的是如何搭建一个支持高并发,高性能的读写数据库框架,使用mysql+redis搭配的高可用、高性能框架。该套框架在多个项目使用过,也在棋牌类项目里面使用过。

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧