2013-01-24 50 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

非常感謝你的工作 –

相關問題