使用MySQL来更新组中的字段

Cyn*_*ial 3 mysql

id     item_id    item_order
---    ---------- -----------
1      1          0
2      1          0
3      1          0

4      2          0
5      2          0
6      2          0

7      3          0
8      3          0
9      3          0
10     3          0
Run Code Online (Sandbox Code Playgroud)

如何使用MySQL statementorder字段更新为:

id     item_id    item_order
---    ---------- -----------
1      1          1
2      1          2
3      1          3

4      2          1
5      2          2
6      2          3

7      3          1
8      3          2
9      3          3
10     3          4
Run Code Online (Sandbox Code Playgroud)

She*_*epy 5

子查询可以提供优雅的解决方案.假设您的表被调用test:

UPDATE test a SET item_order = ( 
  SELECT count(*) FROM ( SELECT id, item_id FROM test ) b
  WHERE a.item_id = b.item_id AND b.id <= a.id
)
Run Code Online (Sandbox Code Playgroud)

这个怎么运作?对于每一行,它将查询具有相同item_id和更低或相等id的行数.这可能不像其他解决方案那样可扩展,我还没有测试,但对于较小的表,这更容易理解和更新.

请注意,这b是另一个子查询.这将迫使MySQL创建一个内部临时表,以便它不会抱怨我们正在从我们正在更新的表中读取.