Sql 是否有一个查询可以更新;序列号“;跨多个组?
对于如下所示的表,是否有一种查询方法可以从此表更新该表:Sql 是否有一个查询可以更新;序列号“;跨多个组?,sql,mysql,Sql,Mysql,对于如下所示的表,是否有一种查询方法可以从此表更新该表: | id | type_id | created_at | sequence | |----|---------|------------|----------| | 1 | 1 | 2010-04-26 | NULL | | 2 | 1 | 2010-04-27 | NULL | | 3 | 2 | 2010-04-28 | NULL | | 4 | 3 |
| id | type_id | created_at | sequence |
|----|---------|------------|----------|
| 1 | 1 | 2010-04-26 | NULL |
| 2 | 1 | 2010-04-27 | NULL |
| 3 | 2 | 2010-04-28 | NULL |
| 4 | 3 | 2010-04-28 | NULL |
为此(请注意,在处创建的用于排序,序列
按类型id
进行“分组”):
我以前见过一些代码使用了@variable,如下所示,我认为可能有效:
SET @seq = 0;
UPDATE `log` SET `sequence` = @seq := @seq + 1
ORDER BY `created_at`;
但这显然不会将每个类型的id的序列重置为1
如果没有单一的查询方法,那么最有效的方法是什么
此表中的数据可能会被删除,因此我计划在用户完成编辑后运行一个存储过程,以对表重新排序。我不太了解MySQL,但您可以使用子查询,尽管它可能非常慢
UPDATE 'log' set 'sequence' = (
select count(*) from 'log' as log2
where log2.type_id = log.type_id and
log2.created_at < log.created_at) + 1
更新“日志”设置“序列”=(
从“日志”中选择计数(*)作为日志2
其中log2.type\u id=log.type\u id和
log2.created_at
但是,如果两个类型id在日期创建了相同的类型id,您将得到重复的序列。您可以使用另一个变量存储以前的类型id(@type\u id
)。查询是按类型_id
排序的,因此每当类型_id
发生变化时,序列必须再次重置为1
Set @seq = 0;
Set @type_id = -1;
Update `log`
Set `sequence` = If(@type_id=(@type_id:=`type_id`), (@seq:=@seq+1), (@seq:=1))
Order By `type_id`, `created_at`;
这是非常非常聪明的东西!谢谢
Set @seq = 0;
Set @type_id = -1;
Update `log`
Set `sequence` = If(@type_id=(@type_id:=`type_id`), (@seq:=@seq+1), (@seq:=1))
Order By `type_id`, `created_at`;