Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL排序列A&;更新B列_Mysql_Sql_Sorting - Fatal编程技术网

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的玩笑,所有的系统对于那些标准字符都有相同的值,不必担心它是否不同