Mysql SQL排序列A&;更新B列
我有一个表,数据类似于:Mysql SQL排序列A&;更新B列,mysql,sql,sorting,Mysql,Sql,Sorting,我有一个表,数据类似于: Inven DESCRIPT PrintOrder --------------------------------- 1 D 9 2 B 0 3 A 5 4 Z 0 5 X 1 . . . . .
Inven DESCRIPT PrintOrder
---------------------------------
1 D 9
2 B 0
3 A 5
4 Z 0
5 X 1
. . .
. . .
. . .
我想按列DESCRIPT降序alpha(A-Z)对表进行排序,然后更新列PRINTORDER,这样完成后,PRINTORDER=1的记录的alpha(A)最高,PRINTORDER值最高的记录的alpha(Z)最低
在不使用临时列的情况下是否可以执行此操作?不是交易破坏者,如果不是,只是一种偏好
预期结果:
根据排序结果更新PrintOrder值的步骤
Inven DESCRIPT PrintOrder
---------------------------------
1 D 3
2 B 2
3 A 1
4 Z 5
5 X 4
这应该做到:
Update T
set PRINTORDER = ASCII(UPPER(DESCRIPT)) - 64
而在您的系统中,A的ASCII为65。:)
编辑:
正如您所说,可能还有其他内容,因此我们需要对其进行一些更改,假设您有一个PK列名作为Id:
UPDATE T
set PRINTORDER = T2.Order
FROM T
INNER JOIN (SELECT IDENTITY(int, 1,1) AS Order,Id FROM T Order By DESCRIPT ASC) T2 ON T.Id=T2.Id
但在这种情况下,即使两条记录具有相同的描述符,最终也会有不同的打印顺序,如果您想保持它们相同,则可能会更复杂一些
编辑:
抱歉,刚刚意识到您使用的是MySql,标识(int,1,1)来自SQL Server,基本上它会生成一个行号,您可能需要一些不同的东西才能有一个:我不清楚您是要修改表还是只创建一个结果集。以下是使用标准SQL的后一种解决方案:
select Inven, Descript, row_number() over (order by Descript) as PrintOrder
from table t
order by Descript;
编辑:
在MySQL中,select
如下所示:
select t.*
from (select Inven, Descript, (@rn := @rn + 1) as PrintOrder
from table t cross join (select @rn := 0) params
order by Descript
) t
order by Inven;
更新
稍微复杂一些,因为您无法对变量进行排序和初始化:
update t
set PrintOrder = (@rn := coalesce(@rn + 1, 1))
order by Descript;
到了我的办公室,和同事聊天后,提出的问题完全不准确。因此,我将关闭此线程,并打开一个新线程,其中包含对问题更准确的描述
感谢Gordon&Simon的回复,非常感谢。您能编辑您的问题并提供所需的输出吗?另外,用您正在使用的数据库标记您的问题。另外,您是只需要一个结果集还是要修改数据库中的数据?我添加了一个示例结果。它是MySQL谢谢明天在办公室进行测试并选择答案。谢谢大家的帮助!将有INT值和特殊字符(0-9$%等)。这个事实会改变你的答案吗?比如-32或者更多?(为了说明起见,我只把它列为A-Z)或者它取决于为DB定义了什么字符集?嗯,我认为这里只有A-Z,在这种情况下,它实际上取决于你想如何对这些值进行排序,只要只涉及一个字符,ASCII对它们的排序应该是准确的。但如果您有特殊字符,它们可能具有较低的ASCII数,则a不能从开始。我是在开ASCII的玩笑,所有的系统对于那些标准字符都有相同的值,不必担心它是否不同