MySql-根据另一列递增
我有一个innoDB表,它有3列:ID、ID\u、ROWPOS。ID为自动增量,ROWPOS具有来自其他表的值。如果ROWPOS不是序列,我需要将ID_父增加1,如果它是序列ID_父不应该增加 像这样:MySql-根据另一列递增,mysql,Mysql,我有一个innoDB表,它有3列:ID、ID\u、ROWPOS。ID为自动增量,ROWPOS具有来自其他表的值。如果ROWPOS不是序列,我需要将ID_父增加1,如果它是序列ID_父不应该增加 像这样: ID | ID_FATHER | ROWPOS 1 | 1 | 250 2 | 2 | 253 3 | 2 | 254 4 | 3 | 260 5 | 4 | 263 6 |
ID | ID_FATHER | ROWPOS
1 | 1 | 250
2 | 2 | 253
3 | 2 | 254
4 | 3 | 260
5 | 4 | 263
6 | 5 | 268
7 | 6 | 270
8 | 6 | 271
9 | 6 | 272
10 | 7 | 276
有办法吗
使用此查询:
INSERT INTO mytable (i, rowpos)
SELECT @i := IF(t.rowpos = @prev_rowpos + 1, @i, @i + 1) AS i
, @prev_rowpos := t.rowpos AS rowpos
FROM temp
JOIN (SELECT @prev_rowpos := NULL, @i := 0) v
ORDER BY t.rowpos
我可以导入到我想要的表中。但是问题出在TABLE.Service中,正如您可以看到的那样,使用这个解决方案,ID\u父亲是错误的,因为它只增加1
但在这种情况下,它实际上应该是2,因为发票1没有服务
如何在不更改所有模式的情况下解决此问题
TABLE.temp
ROW|TYPE |INVOICE_temp
1 |xxx |10
2 |xxP |led tv
3 |xxP |mp3 Player
4 |xxx |11
5 |xxP |tv cable
6 |xxS |install
xxx = Invoice number
xxP = Product
xxs = service
TABLE.Invoice_Number TABLE.Product
ID|ID_FATHER|ROWPOS|NUM ID|ID_FATHER|ROWPOS|PROD
1 | 1 | 1 | 10 1 | 1 | 2 | led tv
2 | 2 | 4 | 11 2 | 1 | 3 | mp3 player
3 | 2 | 5 | tv cable
TABLE.Service
ID|ID_FATHER|ROWPOS|SERV
1 | 1 | 6 | install
我在查询中做了一些更改以根据需要工作 例如:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,rowpos INT NOT NULL
);
INSERT INTO my_table (rowpos) VALUES
(250),
(253),
(254),
(260),
(263),
(268),
(270),
(271),
(272),
(276);
SELECT x.*
, @i:=@i+ISNULL(y.id) i
FROM my_table x
LEFT
JOIN my_table y
ON y.id < x.id
AND y.rowpos = x.rowpos - 1
, (SELECT @i:=0) vals
ORDER
BY x.id;
+----+--------+------+
| id | rowpos | i |
+----+--------+------+
| 1 | 250 | 1 |
| 2 | 253 | 2 |
| 3 | 254 | 2 |
| 4 | 260 | 3 |
| 5 | 263 | 4 |
| 6 | 268 | 5 |
| 7 | 270 | 6 |
| 8 | 271 | 6 |
| 9 | 272 | 6 |
| 10 | 276 | 7 |
+----+--------+------+
你可以这样做:
INSERT INTO mytable (i, rowpos)
SELECT @i := IF(t.rowpos = @prev_rowpos + 1, @i, @i + 1) AS i
, @prev_rowpos := t.rowpos AS rowpos
FROM another_table t
JOIN (SELECT @prev_rowpos := NULL, @i := 0) v
ORDER BY t.rowpos
仅测试SELECT查询,在使用INSERT为其排序之前,获取返回所需结果集的工作
为了完整起见,我要补充一点,这项技术依赖于MysQL中使用用户变量的未记录和未保证的行为。我已经多次成功地使用过这种方法,但对于一次性类型的管理函数,从未作为SQL嵌入到应用程序中
请注意,表达式在“选择”列表中的顺序很重要,它们将按照它们在“选择”列表中出现的顺序进行计算。MySQL不能保证这种行为,但我们确实观察到了。在将当前行值分配给用户变量之前,检查包含前一行值的用户变量非常重要。这就是为什么我先返回,然后是rowpos。如果您颠倒了SELECT列表中的顺序,查询将以不同的方式运行,我们将不会得到相同的结果
别名为v的内联视图用于初始化用户变量。由于MySQL在外部查询运行之前将该视图查询具体化为一个派生表,因此这些变量在外部查询中引用之前会被初始化。我们并不真正关心内联视图查询实际返回什么,只是需要它只返回一行,因为我们在连接操作中将它引用到我们真正想要查询的表中 它工作得很好,但我发现了另一个问题,如上所示。你有办法解决这个问题吗?