2009年7月 6日

[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@xxxxx
> Subject: [mysql 14963] Re: 複雑なdeleteの書き方
> To: ml@xxxxx
>
> 柳本さん
>
> ありがとうございます。
> 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/


投稿者 xml-rpc : 2009年7月 6日 23:50
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/86486
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。