我有一个表,它看起来像这样:
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的播放器仍将被返回。