Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否有一个查询可以更新;序列号“;跨多个组?_Sql_Mysql - Fatal编程技术网

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`;