2009-10-04 5 views
3

Quelqu'un peut-il me dire pourquoi ce qui suit se passe, et comment le réparer?La requête MySQL est devenue folle?

J'ai une requête MySQL avec une clause ORDER BY qui ressemble à ceci ..

ORDER BY (did_voteup-did_votedown) DESC, did_voteup DESC 

Il devrait commander les résultats par leur note "efficace", comme dans ..

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

Cependant, comme vous pouvez le voir sur my page here, il est leur ordonnant de mal, et de me donner ce ..

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

Évidemment, cette rangée 1ère place ne devrait pas être là.


Plus d'informations ..

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

Quelle est la requête complète? – scottm

+0

Ressemble à un problème de type de données, pouvez-vous s'il vous plaît montrer toute la requête et la structure de la table s'il vous plaît? –

+1

Comme David a dit, si le champ est une chaîne, il mettra 1, 10, 2 type de folie. – Deverill

Répondre

8

Il est un issue regarding subtraction from unsigned integers connu.

La soustraction entre valeurs entières, dont l'une est de type UNSIGNED, produit un résultat non signé par défaut. Si le résultat aurait été négatif, il devient la valeur entière maximale . Si le mode SQL NO_UNSIGNED_SUBTRACTION est activé, le résultat est négatif.

Référence: Numeric Types