Codeigniter 3.0查询错误

时间:2016-01-24 20:12:59

标签: php mysql codeigniter

复制此表: 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 =>);

那么我的问题是...... ,但为什么

我也会接受一个答案,这是从代码点火器查询构建器运行此查询的另一种方法,但理想情况下我想知道为什么这个东西被打破了。

4 个答案:

答案 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'=>]