[前][次][番号順一覧][スレッド一覧]

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]