mysql - 根据另一个字段插入序号 - MySQL

标签 mysql sql

有个类似的问题 Insert sequential number in MySQL

我想向表中插入序号,但基于另一个字段。我有两列 page_numnerparent,所以具有相同父级的行应该有 page_number 作为连续编号。如果父级改变,页面应该重新从 1 开始并增加 1。

我想像这样使用smth

SELECT @i:=0;
SELECT @p:=0;

UPDATE my_table AS t SET page_number = CASE
WHEN @p = t.`parent` THEN @i:=@i+1 
ELSE 1 -- assign current parent to @p ??
END

但是,对于 else 情况,它无法弄清楚如何将新父级分配给 @p

请注意,我正在尝试使用纯 mysql 实现此目的(当然如果可能的话)

谢谢

最佳答案

你可以用这段代码做你想做的事:

set @p := -1;
set @i := 0;

UPDATE my_table t
    SET page_number = (CASE WHEN @p = t.`parent` THEN @i := @i+ 1 
                            WHEN (@p := t.parent) = NULL THEN NULL -- never happens
                            ELSE @i := 1
                       END)
    ORDER BY t.parent;

不幸的是,MySQL 不允许在同一个UPDATE 查询中同时使用ORDER BYJOIN。如果是,您可以初始化查询中的变量。

注意第二个条件只是做赋值。 = NULL 从不返回 TRUE

关于mysql - 根据另一个字段插入序号 - MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33056444/

相关文章:

mysql - 如何使用 CodeIgniter 将 NULL 插入数据库?

sql - 甲骨文看好前景

mysql - 我正在使用 NOT IN 但速度很慢

php - 如何从表中选择列值?

javascript - 当另一个用户更新 mysql 中的表时,我可以在不使用 setInterval() 函数的情况下触发 javascript 函数吗

php - 从 PHP 页面记录 MySQL 响应

mysql - 从具有不同结果的两个不同的 mysql 表中获取信息

sql - PostgreSQL 值 1 和 11 的差异

sql - Data Studio CASE 错误 - THEN/ELSE 参数具有不兼容的类型 : TEXT/NUMBER

php - 要在同一页面中显示的复选框值