2013-01-24 49 views
1

我有个博客。我写了简单的投票系统。我的想法可能是错误的。我有这样mysql计算两个数之间的差异

ID标题文章表TotalVotes VoteSum

当有人给予好评的文章TotelVotes得一分,如果有人downvote的文章VoteSum cloumn获得1点

当我显示文章的投票我做这

<?php 
$Vote = $ROW['TotelVotes']-$ROW['VoteSum']; 
?> 

它工作得很好,但我的头版上我想告诉热门文章所以我做了这个MySQL查询

SELECT TotalVotes-VoteSum AS diff FROM `articles` ORDER BY `diff` DESC 

当我做到这一点我收到的数字是这样18446744073709551615发生这种情况,例如当TotalVotes小于VoteSum

数据类型为INT UNSIGNED

我该怎么办错了吗?你可以帮我吗?谢谢。

+0

尝试... [ABS(TotalVotes-VoteSum)](http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_abs)...或者它可能是一个由于列的数据类型问题。 –

+2

TotalVotes和VoteSum的数据类型是什么? –

+0

和第二个问题,你想能够检索负值,不是吗? –

回答

7

可以使用IF

SELECT IF(TotalVotes >= VoteSum, TotalVotes-VoteSum, VoteSum-TotalVotes) AS diff 
FROM `articles` 
ORDER BY `diff` DESC 

UPDATE

,如果你想获得负值,使这些列作为INT SIGNED这样你就可以得到底片。并直接运行你自己的查询,

SELECT TotalVotes-VoteSum AS diff 
FROM `articles` 
ORDER BY `diff` DESC 
+0

非常感谢你的工作。 –

1

使用数学函数ABS

SELECT ABS(TotalVotes-VoteSum) AS diff 
FROM `articles` 
ORDER BY `diff` DESC 
+0

这不工作顺便说一句,错误将发生在ABS呼叫之前。 – Cthulhu

+0

@Cthulhu,OP标记为mysql和'ABS()'是合法的函数。 [检查它](http://www.sqlfiddle.com/#!2/ecb5f/5) –

+0

但OP的问题是'unsigned'数据类型。如果我在你身上设置'unsigned',我会得到一个错误:[小提琴](http://www.sqlfiddle.com/#!2/927c4/1)。 – Cthulhu

4

试试这个:

SELECT cast(TotalVotes as int)-cast(VoteSum as int) AS diff 
FROM `articles` 
ORDER BY `diff` DESC 

这将修复如果签名问题存在于数据库中,则会出现问题。默认情况下,int数据类型已签名(在MySQL中以及我知道的每个其他数据库中)。

+0

Best answer yet!打我吧 –

+0

非常感谢你的工作 –

相关问题