微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – MySQL减去两列并将它们与WHERE子句中的数字进行比较

我有一个看起来像这样的表:

id | some | irrelevant | data | time | waste_time | logged_in
--------------------------------------------------------------
1  |      |            |      | 0    | 246        | 0
2  |      |            |      | 0    | 360        | 0
3  |      |            |      | 116  | 116        | 0
4  |      |            |      | 291  | 199        | 0
5  |      |            |      | 3997 | 520        | 0
6  |      |            |      | 0    | 175        | 0
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

我正在尝试根据time-waste_time列的结果将数据从中呈现为多个< table> s.
我以为我有它工作,但我在我的代码中发现了一个错误.如果结果是负数,则将其与0(time – waste_time> 0)进行比较只会被忽略.

这些是我的疑问:

SELECT * FROM players WHERE time-waste_time > 0 OR logged_in=1 ORDER BY logged_in DESC,login DESC

SELECT * FROM players WHERE time-waste_time > 0 AND login < $time_limit ORDER BY login DESC

SELECT * FROM players WHERE time-waste_time <= 0 AND logged_in=0 ORDER BY login DESC

一个查询显示具有时间0和waste_time 150的玩家,即使0-150 = -150和-150 <1. 0和第三个查询将不会显示此类播放器.
预期的结果是,第一个和第二个查询不会返回此类播放器,但第三个查询将返回此播放器.

我已经找到了这个答案:Using ‘Greater than’ operator with a negative number但它没有帮助.

任何想法为什么它是这样的,我怎么能让它工作?

Ps.:logged_in是ZERO

谢谢.

解决方法

看起来如果你使用UNSIGNED字段并且它们在SQL查询中的减法结果是否定的,它会给你错误,即使字段本身不包含负值.

您可以在SQLFiddle中尝试此代码.

链接http://sqlfiddle.com/#!9/80bbc/1

CREATE TABLE myTable(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(200),time INT(11) UNSIGNED,waste_time INT(11) UNSIGNED,logged_in tinyint(3));

INSERT INTO myTable (name,time,waste_time,logged_in) VALUES ("test1",246,0);
INSERT INTO myTable (name,logged_in) VALUES ("test2",360,logged_in) VALUES ("test3",116,logged_in) VALUES ("test4",291,199,logged_in) VALUES ("test5",3997,520,logged_in) VALUES ("test6",125,0);

而这个查询

SELECT *
FROM myTable
WHERE time - waste_time > 0 OR logged_in = 1;

SELECT *
FROM myTable
WHERE time - waste_time <= 0 AND logged_in = 0;

现在,这里是没有UNSIGNED INT字段的版本:http://sqlfiddle.com/#!9/f6dbd/1

修复它的方法是要么不使用UNSIGNED整数,要么在进行这样的比较时,将结果转换为SIGNED整数

CAST((time - waste_time) AS SIGNED)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐