【发布时间】:2016-05-01 01:43:28
【问题描述】:
复制此表:User_Posts
ID | Upvotes | Downvotes | CAT |
___________________________________
42134 | 5 | 3 | Blogs|
------------------------------------
12342 | 7 | 1 | Blogs|
-------------------------------------
19344 | 6 | 2 | Blogs|
------------------------------------
我需要获取某个项目在其类别中的排名。因此 ID:19344 排名第 2,获得 4 次支持,排在 12342 之后,获得 6 次支持。排名由其类别中的(赞成-反对)计数确定。
所以我写了这个 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)。这是正确的结果
但是,当我尝试通过 code-igniter 的查询构建器构建它时,我得到了
$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=>);
那么我的问题是...... 但是为什么?
我也将接受一个答案,即从 code-igniters 查询生成器运行此查询的另一种方法,但理想情况下,我想知道为什么这个东西坏了。
【问题讨论】:
-
您不能将 SQL 简化为
SELECT (Upvotes - Downvotes) AS rank FROM User_Posts WHERE CAT = 'Blogs' AND POST_ID = 19344;吗?似乎这在 CI 的查询构建器中也很容易实现。 -
@quickshiftin rank 不是(upvotes-downvotes)的数量,而是该项目相对于同一类别中其他项目的位置。
-
好的,你如何解释给定类别的(upvotes-downvotes)关系?
-
@quickshiftin 好问题,现在它只是相同的排名
-
我可能会结合使用查询日志和调试器来跟踪它。另一种选择是查看代码点火器可以使用的替代查询。也许它不喜欢你当前查询中的变量赋值。
标签: php mysql codeigniter