MYSQL多表删除

时间:2012-10-24 23:47:38

标签: php mysql

我有2个表设置如下:

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

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

我想删除Items中的所有记录,last_update今天不是,categories.tree_id对应的Categories等于1.但是,我不想删除任何内容来自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

然而,这似乎只删除了tree_id为{1}的每条记录。只要last_update字段为today,就应该保留{{1}}为1的项目

我错过了什么?

3 个答案:

答案 0 :(得分: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字段的日期组件。

答案 1 :(得分: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
    )

答案 2 :(得分:-1)

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

相关问题