我如何在Jasper Reports中执行多个mysql查询不是您的想法……

问题描述

|| 我有一个复杂的查询,需要在其中排序。我已经知道,使用此页上的技术可以实现此目的的标准方法: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。然后,我将其用作报告的输入数据。有点令人费解,但它可以工作。