0

我有两个这样的表设置:

Items:
   id (int)
   name (varchar)
   category (int)
   last_update (timestamp)

Categories
   id (int)
   name (varchar)
   tree_id (int)

我想从 中删除所有记录Items,谁last_update不是今天,谁对应categories.tree_id等于 1。但是,我不想从Categories表中删除任何内容,只删除Items表。我试过这个:

$query = "DELETE FROM items USING categories, items
    WHERE items.category = categories.id
    AND categories.tree_id = 1
    AND items.last_update != '".date('Y-m-d')."'";

然而,这似乎只是删除了每一个tree_id为 1 的记录。它应该保留 atree_id为 1 的项目,只要它们的last_update字段是today

我错过了什么?

4

3 回答 3

1

如果 last_update 是一个时间戳字段,并且您只在 where 子句中传入一个日期(没有时间组件),那么您实际上是在执行此操作(例如,如果传入 2012-10-24):

AND items.last_update != 2012-10-24 00:00:00

这意味着时间戳中没有确切第二个值的每一行都将被删除。你最好做类似的事情

AND items.last_update NOT LIKE '".date('Y-m-d')."%'";

当然,您要确保在 last_update 上有一个索引。

或者,如果您不关心 last_update 字段上的索引性能(即,您只是将其作为一次性查询并且不想索引该字段),您可以这样做,这对某些人来说可能更符合逻辑

AND DATE(items.last_update) <> '".date('Y-m-d')."'"

底线是您只需要以某种方式比较 last_updated 字段的日期部分。

于 2012-10-24T23:54:15.937 回答
0

听起来你需要一个子查询

DELETE FROM items USING categories, items
    WHERE items.category = categories.id
    AND items.last_update != '".date('Y-m-d')."'"
    AND items.id in 
    (
      SELECT id from items inner join categories on item.category = categories.id
    )
于 2012-10-24T23:56:32.690 回答
-1

您说 last_update 包含时间戳 - 我假设 UNIX 时间戳。您永远无法找到与执行时间戳时具有相同时间戳的记录,并且您无法将时间戳与格式化日期进行比较,它们永远不会对应。因此,您需要以 date(Ymd) 格式将数据存储在 last_update 列中,以便比较那些不相等的数据。

于 2012-10-24T23:54:24.407 回答