mysql:14965
From: "Kaname Kuji\(Y7\)" <"Kaname Kuji\(Y7\)" <kkuji@xxxxxxxxxx>>
Date: Tue, 7 Jul 2009 11:37:16 +0900
Subject: [mysql 14965] Re: 複雑なdeleteの書き方
KK@IB です。 読んでいて、不思議だったので、以下のようにテストしてみました。 テーブルの作成: create table mltest( id int auto_increment, user_id int, member_id int, page_id int, created date, primary key(id), unique key(user_id,member_id,page_id) ); データ設定: insert into mltest( id, user_id, page_id, created) values ( 1, 1, 1, '2009-06-15'), ( 2, 2, 3, '2009-07-05'), ( 3, 2, 1, '2009-07-05'), ( 4, 1, 2, '2009-07-05'); 設定結果: id user_id member_id page_id created 1 1 NULL 1 2009-06-15 2 2 NULL 3 2009-07-05 3 2 NULL 1 2009-07-05 4 1 NULL 2 2009-07-05 (ご質問再掲:page_id=1 and created+ interval 7 day > now() がtrueの場合、該当するuser_idのすべてを削除したいのですがどのように書け ばいいでしょうか?) 条件の確認: SELECT * FROM `mltest` WHERE page_id =1 AND date_add( created, INTERVAL 7 DAY ) > now( ) ; 選択された結果: id user_id member_id page_id created 3 2 NULL 1 2009-07-05 私の考え:条件をそのままdeleteに使えばよい。(別に複雑な削除条件ではないようにも感じる。) 削除した行数: 1 (クエリの実行時間 0.0009 秒) 実行した SQL: DELETE FROM `mltest` WHERE page_id =1 AND date_add( created, INTERVAL 7 DAY ) > now( ) ; 確認: 実行した SQL: SELECT * FROM `mltest` id user_id member_id page_id created 1 1 NULL 1 2009-06-15 2 2 NULL 3 2009-07-05 4 1 NULL 2 2009-07-05 条件で指定されたものが消えているかと... ----- Original Message ----- From: "chuuken kenkou" <ken_ken_1962@xxxxxxxxxx> To: <ml@xxxxxxxxxx> Sent: Monday, July 06, 2009 11:50 PM Subject: [mysql 14964] Re: 複雑なdeleteの書き方 > > chuukenです。 > > 提示されてデータに誤りがあるのでしょうかね? > 検索条件で対象になるのは、id=3の行であり、削除対象になるのはuser_id=2に > > なるのでは? > > 他にも提示内容に、次のような誤りや適切かどうか?があるので、一応、念のため。 > > > (1)表定義のunique指定中のmember_idが、列定義にない > (2)date型のcreated列と日時が返るnow関数での比較は妥当な処理? > (3)intarval → inerval > > > MySQLでは、updateやdeleteの検索条件で、サブクエリした表そのものを更新 > したり、削除したりできないという制限があります。 > この制限を回避するには、MySQLの独自機能の「複数表のupdate、delete」を > 利用するといった方法が考えられます。 > > 例えば、こんな感じです。 > > delete t1 > from t1,(select distinct user_id > from t1 > where page_id=1 > and created + interval 7 day> current_date) as x > where t1.user_id=x.user_id > > > > > > > ---------------------------------------- >> Date: Mon, 6 Jul 2009 18:14:39 +0900 >> From: shu@xxxxxxxxxx >> Subject: [mysql 14963] Re: 複雑なdeleteの書き方 >> To: ml@xxxxxxxxxx >> >> 柳本さん >> >> ありがとうございます。 >> ERROR 1093 (HY000):You can't specify target table 'test' for update in >> FROM clause >> となっております。 >> サブクエリは無理!といわれているっぽいです。 >> 1文では不可能なのでしょうか? >> 無理な場合はストアドかPerlなどのプログラムから実行します。 >> >>> 柳本です。 >>> >>> delete from [テーブル名] >>> where user_id in ( >>> select user_id from [テーブル名] >>> where page_id = 1 >>> and created + cast('7 days' as interval)> now() >>> ) >>> >>> こうですか?わかりません>< >>> >>> tysmk さんは書きました: >>>> お世話になっております。 >>>> >>>> 以下のようなテーブルがあったと仮定します。 >>>> >>>> id int auto_increment, >>>> user_id int, >>>> page_id int, >>>> created date, >>>> primary key(id), >>>> unique key(user_id,member_id,page_id) >>>> >>>> このテーブルから >>>> page_id=1 and created+ intarval 7 day> now() >>>> がtrueの場合、該当するuser_idのすべてを削除したいのですがどのように書け >>>> ばいいでしょうか? >>>> >>>> わかりやすく書くと舌のようにデータが入っていた場合、消えるのは >>>> id = 1 and id = 4 >>>> になります。 >>>> >>>> id user_id page_id created >>>> 1 1 1 2009-06-15 >>>> 2 2 3 2009-07-05 >>>> 3 2 1 2009-07-05 >>>> 4 1 2 2009-07-05 >>>> >>>> >>>> ご教示お願いいたします。 >>>> >>> >>> >>> >>> >> >> > > _________________________________________________________________ > 無料で使える25GB。USBメモリの代わりに、Webに保存 > http://clk.atdmt.com/GBL/go/153787332/direct/01/ > > > > __________ ESET NOD32 Antivirus からの情報, ウイルス定義データベースのバージョン 4219 (20090705) __________ > > このメッセージは ESET NOD32 Antivirus によって検査済みです。 > > http://canon-its.jp > > >
14954 2009-07-06 16:45 [tysmk <shu@xxxxxxxxx] 複雑なdeleteの書き方 14955 2009-07-06 16:57 ┣[<y-iida@xxxxxxxxxx> ] 14958 2009-07-06 17:15 ┃┗[tysmk <shu@xxxxxxxxx] 14957 2009-07-06 17:12 ┣[Yoshiaki Yanagimoto ] 14963 2009-07-06 18:14 ┃┗[tysmk <shu@xxxxxxxxx] 14964 2009-07-06 23:50 ┃ ┗[chuuken kenkou <ken_] -> 14965 2009-07-07 11:37 ┃ ┗["Kaname Kuji\(Y7\)" ] 14959 2009-07-06 17:42 ┣[Katsutoshi Nakatomi ] 14961 2009-07-06 17:57 ┃┗[tysmk <shu@xxxxxxxxx] 14962 2009-07-06 18:09 ┃ ┗[Katsutoshi Nakatomi ] 14966 2009-07-07 12:41 ┗["N.K." <nakai.kanako]