gpt4 book ai didi

MySql - 根据另一列递增

转载 作者:行者123 更新时间:2023-11-30 23:01:08 26 4
gpt4 key购买 nike

我有一个包含 3 列的表 (innoDB):ID、ID_FATHER、ROWPOS。 ID 是 auto_increment 并且 ROWPOS 具有来自其他表的值。如果 ROWPOS 不是序列,我需要将 ID_FATHER 递增 1,如果它是序列,则 ID_FATHER 不应递增。

像这样:

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_FATHER 是错误的,因为它只递增 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

我根据需要对查询进行了一些更改。

最佳答案

你可以这样做:

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 嵌入到应用程序中。

请注意,SELECT 列表中表达式的顺序很重要,它们按照它们在 SELECT 列表中出现的顺序进行计算。 (MySQL 不保证这种行为,但我们确实观察到它。重要的是检查包含前一行值的用户变量先于将当前行值分配给用户变量. 这就是为什么首先返回 i ,然后返回 rowpos 的原因。如果你颠倒 SELECT 列表中那些的顺序,查询将以不同的方式运行,我们就不会得到相同的结果。

内联 View (别名为v)的目的是初始化用户变量。由于 MySQL 在外部查询运行之前将该 View 查询具体化为“派生表”,因此这些变量在外部查询中被引用之前会被初始化。我们并不真正关心内联 View 查询实际返回什么,除了我们需要它只返回一行(因为我们在 JOIN 操作中引用它到我们真正想要查询的表)。

关于MySql - 根据另一列递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23914184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com