Php 带有额外分组的mysql排序字段增量值
我损坏了排序顺序字段,需要通过将行更新为增量顺序来更正该字段。当没有分组时,此解决方案非常有效:Php 带有额外分组的mysql排序字段增量值,php,mysql,Php,Mysql,我损坏了排序顺序字段,需要通过将行更新为增量顺序来更正该字段。当没有分组时,此解决方案非常有效: SET @i := 0; UPDATE tbl SET sort_order= @i:=@i+1 ORDER BY sort_order; 但是,当您谈论一个需要为每个组重置sort_order字段的表时,该解决方案将失败。在我的例子中,唯一组是用户和类型的组合,因此应该为每个唯一用户/类型组合重置排序顺序 我可以做些什么来更新此文件: id user type name
SET @i := 0;
UPDATE tbl SET sort_order= @i:=@i+1 ORDER BY 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
这个网站上有大量关于行号模拟的答案,下面是另一个在多表更新中使用的答案
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 |
+--------+------+-------+---------+------------+
你说失败是什么意思。。。你有个错误。。显示错误消息,错误结果?显示您的实际结果,您期望的结果,并解释结果的logi您使用的是哪个版本的mysql?@scaisEdge编辑了我的问题,以显示第一个解决方案的结果。@P.Salmon mysql 5.6我没有得到您编号的组-例如,前两行看起来不重复,那么为什么它们的排序顺序为1,2太棒了,谢谢你!甚至是在数十万行的桌子上。绝对超出了我自己能想到的。