0

次のように2つのテーブルをセットアップしています。

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

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

Itemslast_updateが今日ではなく、対応する人が 1 に等しいからすべてのレコードを削除したいのですが、テーブルcategories.tree_idからは何も削除したくありません。私はこれを試しました:CategoriesItems

$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')."'";

ただし、これは 1 であるすべてのレコードを削除するように見えます。フィールドが1 である限り、1 のtree_idアイテムを保持する必要があります。tree_idlast_updatetoday

私は何が欠けていますか?

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 フィールドのインデックス パフォーマンスを気にしない場合 (つまり、これを 1 回限りのクエリとして実行していて、このフィールドにインデックスを付けたくない場合)、これを行うことができます。

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 のタイムスタンプだと思います。スタンプが実行されたときと同じタイムスタンプを持つレコードを見つけることはできず、タイムスタンプをフォーマットされた日付と比較することはできません。それらは決して一致しません。そのため、last_update 列のデータを日付 (Ymd) 形式で保存して、等しくないものを比較する必要があります。

于 2012-10-24T23:54:24.407 に答える