【问题标题】:mysql sort field increment value with extra grouping带有额外分组的mysql排序字段增量值
【发布时间】:2019-01-17 15:50:34
【问题描述】:

我损坏了 sort_order 字段,需要通过将行更新为增量顺序来进行更正。当没有分组时,此解决方案效果很好:

SET @i := 0;
UPDATE tbl SET sort_order= @i:=@i+1 ORDER BY sort_order;

但是当您谈论需要为每个组重置 sort_order 字段的表时,该解决方案将失败。在我的例子中,唯一组是用户和类型的组合,因此 sort_order 应该为每个唯一用户/类型组合重置。

我可以做些什么来更新这个:

id      user    type    name    sort_order
152070  cust    forex   ^EURUSD 3
374143  cust    forex   ^EURGBP 3
376218  cust    stock   IBM     3
376219  cust    stock   FB      3
376219  cust    stock   AMZN    3
374676  degr    forex   ^BTCUSD 3
376217  degr    forex   ^AUDJPY 3
376220  degr    stock   C       3
376221  degr    stock   AMZN    3

看起来像这样:

id      user    type    name    sort_order
152070  cust    forex   ^EURUSD 1
374143  cust    forex   ^EURGBP 2
376218  cust    stock   IBM     1
376219  cust    stock   FB      2
376219  cust    stock   AMZN    3
374676  degr    forex   ^BTCUSD 1
376217  degr    forex   ^AUDJPY 2
376220  degr    stock   C       1
376221  degr    stock   AMZN    2

我也愿意接受 PHP 解决方案。

编辑:

MySql 5.6

我发布的第一个解决方案导致了这个结果,这不是预期的结果。同样,我想按组重新排序。

id      user    type    name    sort_order
152070  cust    forex   ^EURUSD 1
374143  cust    forex   ^EURGBP 2
376218  cust    stock   IBM     3
376219  cust    stock   FB      4
376219  cust    stock   AMZN    5
374676  degr    forex   ^BTCUSD 6
376217  degr    forex   ^AUDJPY 7
376220  degr    stock   C       8
376221  degr    stock   AMZN    9

【问题讨论】:

  • 失败是什么意思? ...你有一个错误..显示错误信息,错误的结果?显示您的实际结果,您的预期结果并解释结果的逻辑
  • 你用的是什么版本的mysql?
  • @scaisEdge 编辑了我的问题以显示第一个解决方案的结果。
  • @P.Salmon mysql 5.6
  • 我没有得到您编号的组 - 例如,前 2 行似乎不是重复的,所以为什么它们的 sort_order 为 1 ,2

标签: php mysql


【解决方案1】:

这个网站上有很多关于行号模拟的答案,这里还有一个用于多表更新的答案。

drop table if exists t;
create table t
(id  int ,   user varchar(20) ,  type varchar(20) ,  name varchar(20),   sort_order int);
insert into t values
(152070 , 'cust'  ,  'forex' ,  '^EURUSD' ,3),
(374143 , 'cust'  ,  'forex' ,  '^EURGBP' ,3),
(376218 , 'cust'  ,  'stock' ,  'IBM'     ,3),
(376219 , 'cust'  ,  'stock' ,  'FB'      ,3),
(376219 , 'cust'  ,  'stock' ,  'AMZN'    ,3),
(374676 , 'degr'  ,  'forex' ,  '^BTCUSD' ,3),
(376217 , 'degr'  ,  'forex' ,  '^AUDJPY' ,3),
(376220 , 'degr'  ,  'stock' ,  'C'       ,3),
(376221 , 'degr'  ,  'stock' ,  'AMZN'    ,3);

update t join
(select t.*,
        if(concat(user,type) <> @p, @rn:=1,@rn:=@rn+1) rownumber,
        @p:= concat(user,type) p
from t
cross join (select @rn:=0,@p:='') r
order by user,type,id) s
on s.id = t.id
set t.sort_order = s.rownumber
;
select * from t;

--------+------+-------+---------+------------+
| id     | user | type  | name    | sort_order |
+--------+------+-------+---------+------------+
| 152070 | cust | forex | ^EURUSD |          1 |
| 374143 | cust | forex | ^EURGBP |          2 |
| 376218 | cust | stock | IBM     |          1 |
| 376219 | cust | stock | FB      |          3 |
| 376219 | cust | stock | AMZN    |          3 |
| 374676 | degr | forex | ^BTCUSD |          1 |
| 376217 | degr | forex | ^AUDJPY |          2 |
| 376220 | degr | stock | C       |          1 |
| 376221 | degr | stock | AMZN    |          2 |
+--------+------+-------+---------+------------+

【讨论】:

  • 这太棒了,谢谢!甚至在有数十万行的桌子上也很快。绝对超出我自己所能想出的范围。
猜你喜欢
  • 2012-07-06
  • 2013-11-08
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
  • 2016-03-24
  • 1970-01-01
  • 2015-09-01
相关资源
最近更新 更多