使用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/