我有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的项目
我错过了什么?
答案 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列中,以便比较那些不相等的数据。