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]