gpt4 book ai didi

mysql - mariadb 按用户函数排序给出了错误的结果

转载 作者:行者123 更新时间:2023-11-29 21:21:11 25 4
gpt4 key购买 nike

使用 MySQL/MariaDB,我通常会执行下面这种查询来获取特定记录的排名,以便我可以在应用程序中显示正确的页面:

SET @rownum := 0;
SELECT rank
FROM
( SELECT @rownum := @rownum+1 AS rank, ordid
FROM ord
order by ord_status, ordid
) AS derived_table
WHERE ordid = 1234
limit 1;

我使用它很多年了,通常工作得很好。

但是,今天,我尝试根据订单状态的描述而不是订单状态 id(字段 ord_status)对查询进行排序。因此,我必须使用我在数据库中创建的名为 getStatusDescription() 的用户函数对数据进行排序。这是我的新查询:

SET @rownum := 0;
SELECT rank
FROM
( SELECT @rownum := @rownum+1 AS rank, ordid
FROM ord
order by getStatusDescription(ord_status), ordid
) AS derived_table
WHERE ordid = 1234
limit 1;

由于未知原因,排名结果是错误的,我不明白为什么它不起作用。 MariaDB 是否可能存在问题或限制?

我在 Centos 7 机器上使用 MariaDB 10.0.17 作为我的开发平台。

供您引用,我的函数 getStatusDescription() 仅接收一个参数(订单状态 ID),然后根据接收到的参数从特定表中选择正确的 varchar(35) 字段,然后返回它。

非常欢迎任何帮助。

盖兰·普兰特

最佳答案

您获得排名的方法很好,但您也可以使用子查询方法:

select count(*)
from ord cross join
(select ordid, getStatusDescription(o2.ord_status) as gsd
from ord o2
where o2.ordid = 1234
) oo
where getStatusDescription(ord_status) < oo.gsd or
(getStatusDescription(ord_status) = oo.gsd and o.ordid <= oo.ordid)

至于你的情况,我不知道根本原因。然而,有时 GROUP BY 会出现变量问题,一个额外的子查询可以修复该问题:

SELECT rank
FROM (SELECT @rownum := @rownum+1 AS rank, ordid
FROM (SELECT ord.*
FROM ord
ORDER BY getStatusDescription(ord_status), ordid
) derived_table CROSS JOIN
(SELECT @rownum := 0) params
) o
WHERE ordid = 1234
LIMIT 1;

关于mysql - mariadb 按用户函数排序给出了错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35713380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com