2011-04-14 17 views
0

我有一个复杂的查询需要一个排名。我已经了解到,这样做的标准方式是使用本页上的技术:http://thinkdiff.net/mysql/how-to-get-rank-using-mysql-query/。我使用Infobright作为后端,并不像预期的那样工作。也就是说,一个标准的MySQL引擎会显示1,2,3,4等等...... Brighthouse(Infobright的引擎)会返回1,1,1,1等....所以我想出了设置变量,函数的策略,然后在查询中执行它。这里的概念查询的证明了这一点:如何在Jasper Reports中执行多个mysql查询(不是你认为的......)

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; 

我然后复制并粘贴功能分为碧玉报告的iReport的,然后编译我的报告。执行它后,我得到语法错误。所以我认为也许是;正在抛弃它。所以在查询的顶部,我放入了DELIMITER;这也没有用。

我想甚至有可能做什么?如果是这样,怎么样?如果有一种Infobright获得排名而不写功能的方式,我也会接受。

回答

0

以下是我解决了这个。我让我的服务器端程序执行一个mysql脚本。然后我将输出结果转换为CSV。然后我用它作为我的报告的输入数据。有点复杂,但它工作。

0

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莱夫斯基的(Infobright的创始人)

希望这有助于...

+0

谢谢你的答案,但它不完全是我要找的。这是很好的MySQL,但不使用brighthouse(Infobright)引擎。它会在brighthouse中为所有元素显示等级1。 – 2011-04-14 15:15:46

+0

你测试过了吗?因为那么输出应该是全0不是1的。 – Johan 2011-04-14 15:21:39

+0

或者,您可以编写写入临时表的存储过程,然后读取临时表。 – Johan 2011-04-14 15:51:10

相关问题