[英]Reverse row "order" value from table MySQL with PHP
我有一个带有行的表,每个表都有一个“订单”值。 现在,我有 500 行,我需要反转“顺序”值。 所以第一个应该是最后一个,依此类推。
例如:
Name | Order
-------------------
Row 1 | 1
Row 2 | 4
Row 3 | 5
Row 4 | 8
Row 5 | 12
Row 6 | 20
现在应该是:
Name | Order
-------------------
Row 1 | 20
Row 2 | 12
Row 3 | 8
Row 4 | 5
Row 5 | 4
Row 6 | 1
我只需要这样做一次,所以性能并不重要。 我怎样才能使用 PHP 做到这一点?
如果您的唯一要求是
所以第一个应该是最后一个,依此类推
您可以否定这些值(正如我在评论中所写)。 这可以用
update mytable set `Order` = - `Order`
但是 - 这是一个 SQL 脚本,它将“交换” Order
列中的值,从最小到最大,从第二小到第二大,依此类推。
create table tmp_asc(
i int auto_increment primary key,
o int,
index (o)
);
insert into tmp_asc(o)
select `Order` from mytable order by `Order` asc;
create table tmp_desc(
i int auto_increment primary key,
o int,
index (o)
);
insert into tmp_desc(o)
select `Order` from mytable order by `Order` desc;
update mytable t
join tmp_asc on tmp_asc.o = t.Order
join tmp_desc on tmp_desc.i = tmp_asc.i
set t.Order = tmp_desc.o;
drop table tmp_asc, tmp_desc;
带有窗口函数的 MySQL 8 使它变得更简单:
with cte as (
select `Order`
, row_number() over (order by `Order` asc) as rn_asc
, row_number() over (order by `Order` desc) as rn_desc
from mytable
)
update mytable t
join cte a on a.Order = t.Order
join cte d on d.rn_desc = a.rn_asc
set t.Order = d.Order;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.