2009年7月 7日

[mysql 14965] Re: 複雑なdeleteの書き方

KK@xxxxx です。

読んでいて、不思議だったので、以下のようにテストしてみました。

テーブルの作成:
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@xxxxx>
To: <ml@xxxxx>
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@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/
>
>
>
> __________ ESET NOD32 Antivirus からの情報, ウイルス定義データベースのバージョン 4219 (20090705) __________
>
> このメッセージは ESET NOD32 Antivirus によって検査済みです。
>
> http://canon-its.jp
>
>
>

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




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