人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQL

カラム job に work_at_hatena が入っているレコードが5件以上在れば最新の五件以外全て削除するSQLを書いて下さい。
ちなみにPHPなどでひとつひとつ処理するのではなく、SQL一文で実現する方法のみを教えて下さい。

ver : 最新

●質問者: esecua
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MySQL PHP SQL ひとつ カラム
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● ふるるP
●19ポイント

テーブルのカラムを(Key, jon)とします。Keyは主キーでオートナンバーとします(ですから数値が大きいほうが新しいレコードです)。テーブル名はwkとします。

delete From wk

Where

KEY In (

SELECT key

FROM wk A

where job like '%work\_at\_hatena%'

and

(Select count(*) From wk where key>A.key and job like '%work\_at\_hatena%')>=5

)

でどうでしょうか。

◎質問者からの返答

NGです。

例えば以下のような

delete from hatena where id in (

select id from hatena where job='work_at_hatena'

order by id desc limit 10

offset 5);

SQLがベストなのですが、以上のSQLは動かないのです、、、

アドバイスを。


2 ● b-wind
●19ポイント
DELETE FROM hatena AS old
 WHERE old.job='work_at_hatena'
 AND
 ( SELECT count(*) FROM hatena AS new WHERE new.job='work_at_hatena' AND new.id > old.id ) > 5

こんなところ?

細かく確認してないから、不等号は逆かもしれんねぇ。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.1 DELETE 構文

◎質問者からの返答

うごかないです。


3 ● ふるるP
●18ポイント

MySQL は使ったことが無いのですけど、インラインビューの中でOrder By は使えないんじゃないかと。

私が提示したのは相関サブクエリですので、

delete From HATENA

Where id In (

SELECT id FROM HATENA A

where job ='work_at_hatena'

and

(Select count(*) From wk

where key>A.key

and job = 'work_at_hatena')>=5

)

となって、Order By は使わないのですが、エラーがでたらどんなエラーですか?

MySQL の仕様として使えないSQLだったら申し訳ない。

◎質問者からの返答

wk?


4 ● hanabc
●18ポイント

コマンドラインで実行すると、こういうエラーが出るケースでしょうか。

> ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'


格好悪いですが、こういうSQLではどうでしょう。

手元の環境では動作しました。


delete from hatena where id in (

select id from (

select id from hatena

where job='work_at_hatena'

order by id desc limit 10 offset 5

) a

);

◎質問者からの返答

ありがとうございます。

うん〜1日に4万回SQLを実行するのでなるべくSELECT等を減らしたものがベストです。


5 ● chuken_kenkou
●18ポイント

うん〜1日に4万回SQLを実行するのでなるべくSELECT等を減らしたものがベストです。

InnoDBでなくMyISAMであれば、auto_increment列をprimary keyの2番目以降に定義するという方法があります。



create table t1
(id int auto_increment,
 job varchar(30),
 primary key(job,id)
)

こうしておけば、次のようにシンプルになります。

delete from t1
 where job='work_at_hatena'
 and id>5
◎質問者からの返答

not workingです。


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ