2009-10-04 112 views
3

誰能告訴我爲什麼會發生以下情況,以及如何解決它?MySQL查詢瘋狂?

我有與訂單MySQL查詢BY子句,看起來像這樣..

ORDER BY (did_voteup-did_votedown) DESC, did_voteup DESC 

因此,應當責令其通過「有效」的評級結果,如..

1st. 10 up - 1 down = 9 effective 
2nd. 10 up - 5 down = 5 effective 
3rd. 10 up - 7 down = 3 effective 

然而,正如你可以看到my page here,它命令他們錯了,給我這個..

1st. 1 up - 3 down = -2 effective 
2nd. 16 up - 6 down = 10 effective 
3rd. 15 up - 5 down = 10 effective 

顯然,那第一個地方的行不應該在那裏。


更多信息..

CREATE TABLE dictionary_definitions (
    did_id int(11) unsigned NOT NULL auto_increment, 
    did_wordid int(11) unsigned NOT NULL default '0', 
    did_userid int(11) unsigned NOT NULL default '0', 
    did_status tinyint(1) unsigned NOT NULL default '0', 
    did_date int(11) NOT NULL default '0', 
    did_definition text, 
    did_example text, 
    did_votecheck int(11) NOT NULL default '0', 
    did_voteup smallint(5) unsigned NOT NULL default '0', 
    did_votedown smallint(5) unsigned NOT NULL default '0', 
    PRIMARY KEY (did_id), 
    KEY (did_wordid), 
    KEY (did_userid) 
) ENGINE=MyISAM; 

SELECT a.did_id, a.did_userid, a.did_definition, a.did_example, 
    a.did_votecheck, a.did_voteup, a.did_votedown, b.user_name, b.user_extra8 
FROM dictionary_definitions AS a LEFT JOIN users AS b ON a.did_userid=b.user_id 
WHERE did_wordid=4 
ORDER BY (did_voteup-did_votedown) DESC, did_voteup DESC LIMIT 0, 5 
+1

什麼是整個查詢? – scottm 2009-10-04 22:30:22

+0

看起來像數據類型的問題,請你能顯示整個查詢和表的結構嗎? – 2009-10-04 22:32:24

+1

正如大衛所說,如果該字段是一個字符串,它會把1,10,2類型的瘋狂。 – Deverill 2009-10-04 22:41:49

回答

8

這是一個衆所周知issue regarding subtraction from unsigned integers

整數值之間的減法,其中一個是UNSIGNED類型,默認情況下會生成一個無符號的 結果。如果結果否則會成爲最大整數值。如果啓用了NO_UNSIGNED_SUBTRACTION SQL模式,則結果爲 爲負數。

參考:Numeric Types