我有两张表如下:
任务:
id int(5) auto_increment,
content mediumtext,
primary key(id)
完成:
id int(10) auto_increment,
taskid int(5),
datetime int(11),
primary key(id)
我正在尝试运行SQL查询来提取今天尚未标记为已完成的任务。我正在用PHP进行时间计算,所以查询本身看起来像这样:
$morning = mktime(0, 0, 0);
$night = mktime(23, 59, 59);
$query = sprintf("SELECT t.id, t.content FROM tasks as t, completed as c WHERE c.datetime < %s AND c.datetime > %s AND t.id != c.taskid", $night, $morning);
出现如下内容:
SELECT t.id, t.content FROM tasks as t, completed as c WHERE c.datetime < 1391471999 AND c.datetime > 1391385600 AND t.id != c.taskid
如果有人能指出我正确的方向,那就太棒了。谢谢:))
答案 0 :(得分:3)
使用逗号运算符是INNER JOINing tables。但是您正在尝试获取在已完成的表中没有相应操作的任务,因此您应该使用LEFT JOIN instead to get those。您还应该使用MySQL日期时间比较,因为它的代码写入较少,您不必一直计算时区。
我认为你没有完成表中未来日期的任务。
SELECT t.id, t.content
FROM tasks as t
LEFT JOIN completed as c ON t.id = c.taskid
WHERE c.datetime < 1391385600
OR c.datetime >= 1391472000
OR c.taskid IS NULL
选择任务,其中:
答案 1 :(得分:1)
我真的不明白。数据集太小而无法代表。如果你无法弄清楚所需的结果集是什么样的,那么你可能不应该在这里;-)。
那就是说,这就是你所追求的......
SELECT t.*
FROM tasks t
LEFT
JOIN completed c
ON c.taskid = t.id
AND c.datetime BETWEEN 1391385600 AND 1391472000
WHERE c.id IS NULL;