根据id和时间戳从两个表中进行选择

时间:2014-02-03 00:59:20

标签: php mysql

我有两张表如下:

任务:

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

如果有人能指出我正确的方向,那就太棒了。谢谢:))

2 个答案:

答案 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

选择任务,其中:

  • 在今天之前完成1391385600
  • 或将来完成1391472000
  • 或者根本没有完成

答案 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;