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


MySQL subtract two columns and compare them to number in WHERE clause

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

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>。我以为我已经让它工作了,但我在代码中发现了一个错误。如果结果是负数,那么将其与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以及第三个查询将不显示这样的玩家。预期结果是,第一个和第二个查询不会返回该玩家,而是由第三个查询返回。

我已经找到了这个答案:使用';大于';运算符,但没有帮助。

有什么想法吗?为什么它会这样,我该如何让它发挥作用?

Ps.:logged_in为零

谢谢。

看起来,如果您使用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)

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

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