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

时间:2015-06-29 19:10:15

标签: php mysql

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

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
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

我正在尝试根据<table>列的结果将数据从中呈现为多个time - waste_time。 我以为我有它工作,但我在我的代码中发现了一个错误。如果结果为负数,则将其与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 < 0,第三个查询也不会显示此类玩家。 预期结果是,第一次和第二次查询不会返回此类播放器,但第三次查询将返回此播放器。

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

任何想法为什么它都是这样的,我怎样才能让它发挥作用?

Ps。: logged_in是ZERO

感谢。

2 个答案:

答案 0 :(得分:3)

看起来如果你使用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", 0, 246, 0);
INSERT INTO myTable (name, time, waste_time, logged_in) VALUES ("test2", 0, 360, 0);
INSERT INTO myTable (name, time, waste_time, logged_in) VALUES ("test3", 116, 116, 0);
INSERT INTO myTable (name, time, waste_time, logged_in) VALUES ("test4", 291, 199, 0);
INSERT INTO myTable (name, time, waste_time, logged_in) VALUES ("test5", 3997, 520, 0);
INSERT INTO myTable (name, time, waste_time, logged_in) VALUES ("test6", 0, 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)

答案 1 :(得分:0)

您的第一个查询中的问题是您使用的是OR关键字。

将选择任何行(time - waste_time)为正,OR其中logged_in = 1`。在您的示例中,只要logged_in = 1,仍会返回结束值为-150的播放器。