【问题标题】:MySQL query gone wild?MySQL 查询变得疯狂?
【发布时间】:2009-10-04 22:25:45
【问题描述】:

谁能告诉我为什么会发生以下情况,以及如何解决?

我有一个带有 ORDER BY 子句的 MySQL 查询,看起来像这样..

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、10、2 类型的疯狂。
  • 附加原始问题。

标签: sql mysql


【解决方案1】:

这是一个已知的issue regarding subtraction from unsigned integers

整数值之间的减法,其中一个是 UNSIGNED 类型,产生一个无符号数 默认结果。如果结果本来是否定的,它就变成 最大整数值。如果启用NO_UNSIGNED_SUBTRACTION SQL 模式,则结果为 消极的。

参考:Numeric Types

【讨论】:

    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多