问题描述
||
我有一个复杂的查询,需要在其中排序。我已经知道,使用此页上的技术可以实现此目的的标准方法:http://thinkdiff.net/MysqL/how-to-get-rank-using-MysqL-query/。我正在使用Infobright作为后端,但无法按预期工作。也就是说,虽然标准的MysqL引擎会将排名显示为1、2、3、4等... Brighthouse(Infobright的引擎)将返回1、1、1、1等。所以我提出了设置变量,函数然后在查询中执行的策略。这是一个概念证明查询,它可以做到这一点:
SET @rank = 0;
DROP FUNCTION IF EXISTS __GetRank;
DELIMITER $$
CREATE FUNCTION __GetRank() RETURNS INT
BEGIN
SET @rank = @rank + 1;
return @rank;
END$$
DELIMITER ;
select __GetRank() AS rank,id from accounts;
然后,我将该函数复制并粘贴到Jasper Report \的iReport中,然后编译我的报告。执行后,我得到语法错误。所以我认为也许是;被扔掉了。因此,在查询的顶部,我输入了DELIMITER;。这也不起作用。
我想做的事甚至可能吗?如果是这样,怎么办?而且,如果有一种Infobright的方法无需编写函数就能获得排名,那么我也很乐意。
解决方法
Infobright不支持功能。
从该站点:http://www.infobright.org/forums/viewthread/1871/#7485
实际上,IB支持存储过程,但不支持存储功能或用户定义的功能。
select if(@rank is null,@rank:= 0,@rank:= @rank +1) as rank,id from accounts
不起作用,因为您无法在查询中写入@vars。
这个:
SELECT
(SELECT COUNT(*)
FROM mytable t1
WHERE t1.rankedcolumn > t2.rankedcolumn) AS rank,t2.rankedcolumn
FROM mytable t2 WHERE ...;
可以工作,但是当然很慢。
免责声明,不是我的代码,而是Jakub Wroblewski的(Infobright创始人)
希望这可以帮助...
,这是我解决此问题的方法。我让服务器端程序执行mysql脚本。然后,我将输出转换为CSV。然后,我将其用作报告的输入数据。有点令人费解,但它可以工作。