复制此表: User_Posts
ID | Upvotes | Downvotes | CAT |
___________________________________
42134 | 5 | 3 | Blogs|
------------------------------------
12342 | 7 | 1 | Blogs|
-------------------------------------
19344 | 6 | 2 | Blogs|
------------------------------------
我需要在其类别中获得项目的排名。因此ID:19344将排名第2位,有4个赞成票,12342位有6个赞成票。排名由(upvotes-downvotes)计数在其类别中确定。
所以我写了这个MySQL查询。
SELECT rank FROM (SELECT *, @rownum:=@rownum + 1 AS rank
FROM User_Posts where CAT= 'Blogs' order by
(Upvotes-Downvotes) DESC) d,
(SELECT @rownum:=0) t2 WHERE POST_ID = '19344'
直接在mysql中运行时返回给我(Rank = 2)。这是正确的结果
然而,当我尝试通过代码点火器的查询构建器构建它时,我得到了
$table = 'User_Posts';
$CAT= 'Blogs';
$POST_ID = '19344';
$sql = "SELECT rank FROM (SELECT *, @rownum:=@rownum + 1 AS
rank FROM $table where CAT= ?
order by (Upvotes-Downvotes) DESC) d,
(SELECT @rownum:=0) t2 WHERE POST_ID= ?";
$query= $this->db->query($sql, array($CAT,$POST_ID))->row_array();
向我返回一个空结果:array(rank =>);
那么我的问题是...... ,但为什么?
我也会接受一个答案,这是从代码点火器查询构建器运行此查询的另一种方法,但理想情况下我想知道为什么这个东西被打破了。
答案 0 :(得分:5)
我完全不知道为什么你的代码无效。我写了另一个解决方案。请尝试以下代码。
$select="FIND_IN_SET( (upvote-downvote), (SELECT GROUP_CONCAT( (upvote-downvote) ORDER BY (upvote-downvote) DESC ) as total FROM (User_Posts))) as rank";
$this->db->select($select,FALSE);
$this->db->from('(User_Posts)',FALSE);
$this->db->where('ID',19344);
$this->db->where('CAT','Blogs');
$query = $this->db->get();
答案 1 :(得分:4)
我过去曾遇到过类似的问题,事实证明我必须首先使用单独的查询初始化变量,我不确定是否仍然如此,但无论如何都要试一试。
//initialize the variable, before running the ranking query.
$this->db->query('SELECT 0 INTO @rownum');
$query= $this->db->query($sql, array($CAT,$POST_ID))->row_array();
答案 2 :(得分:2)
编写存储函数来执行查询。然后让Codeigniter完成
query("SELECT PostRank(?,?)", $CAT, $POST_ID);
限制:由于您无法在存储函数中执行PREPARE
,因此此函数必须特定于一个表User_Posts
。
答案 3 :(得分:1)
我不完全确定这是否是问题,但我会在子查询中初始化@rownum
:
SELECT rank
FROM (
SELECT *,
@rownum:=@rownum + 1 AS rank
FROM $table
JOIN (SELECT @rownum := 0) init
WHERE CAT= ?
ORDER BY (Upvotes-Downvotes) DESC
) d
WHERE post_id = ?
否则我会担心@rownum
未定义(NULL
)并且在计算rank
时保持这种状态(NULL + 1 = NULL
),只会分配值{之后0
。因此,rank
将返回NULL
,您将获得['rank'=>]
。
然后在常量连接(直接在MySQL中)中再次运行它将为您提供正确的结果,因为@rownum
将从上一个查询的值0
开始,rank
将是正确计算。
我猜测每次运行查询时,codeigniter都会启动一个新的连接/事务,@rownum
每次都在NULL
开始,给出['rank'=>]
。