SQLについて質問です。


【commentTbl】
no ・・・連番。オートインクリメント
title  ・・・件名。文字列型(varchar)
message ・・・メッセージ。文字列型(text)
sta   ・・・状態。1は表示。0は非表示

上記のようなコメントを管理するテーブルにて、messageに3つ以上url(http://・・・)を含んでいる書き込みは、
ほぼスパムなので、これのstaを0にするSQL文を書くにはどうすればよいでしょうか?

ご教授よろしくお願いいたします。

使用SQL【MySQL5】

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2011/05/06 18:11:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント60pt

UPDATE

sta = 0

WHERE

LENGTH(REPLACE(message,'http://'.'')) + LENGTH('http://')*2 < LENGTH(message)


未確認ですが こんな感じにすればいいかと思います。

まず、messageに含まれている 'http://'を 無くします。

そうすると 当然 文字数が 短くなります。

'http://'の2つ分よりも 短くなれば 'http://'が 3つ以上あることになります。

このとき staを 0にします。

id:ruijio

ご回答ありがとうございます。

最初うまくできませんでしたが、「message,'http://'.''」のドットをカンマに変えたら無事に動きました。

こういう方法もあるんですね!

勉強になりました。ありがとうございます。

2011/05/06 17:35:52
  • id:asuka645
    SQLだけでは処理できません。
    PHPやRubyなどのスクリプト言語を使う必要があります。
  • id:ruijio
    質問者です。

    update ・・・・・set `sta` = 0 WHERE `message` LIKE '%http://%http://%http://%'

    と単純にこれだけで解決できました。


    >asuka645さん

    コメントありがとうございました。
  • id:taknt
    >LIKE '%http://%http://%http://%'

    これが 有効なのかどうか 確認できなかったので 回答のような方法を提示しました。

    ま、回答のは 今後、何かの参考にしてください。

  • id:ruijio
    >takntさん

    LENGTHやREPLACEはMySQL内では使ったこと無かったので、勉強になりました。

    ちなみに、10回実行した平均時間を比べたところ

    LENGT と REPLACE
    0.0095

    LIKE
    0.0086
    と若干LIKEの方がはやそうでした。10回ではあまり比較にならないかもしれませんが。

    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません