次のような列のTableがあり、行数は10万以上です。
id INT(4) primary
name VARCHAR(64)
keyword TEXT
これから、「AAA」「BBB」「CCC」「DDD」「EEE」などの5種類の単語が、列「keyword」に入っているか Select を使って検索します。
keyword には、例えばこんな文字列が入っています。
AWS4g5h6EDRFTGYHUY7jMAAAOL765P2OKRFIJ5678h77
7b4d3kRCCCG3FKK888K4VGT987YDEEE999E8676h
5gTAAAR5FEDEXECTYEFIHFIERI4635BBB65hrDF4
この時、それぞれの単語が、列「keyword」内に何回出現するかカウントして合計し、その合計回数が多い順に並べ替えたいです。
select * from `Table` Where keyword like %AAA% or keyword like %BBB% or keyword like %CCC% or keyword like %DDD% or keyword like %EEE%
これだと、列「keyword」内に、「AAA」「BBB」「CCC」「DDD」「EEE」のいずれかの単語が含まれているレコードをSELECTしてくるSQL文になってしまいます。
そこで、このサイトを参考にしました。
https://monotone.jp/archives/19971
「AAA」が列「keyword」内に含まれる回数が多い順に取ってくるには、
SET @word:='AAA' SELECT (( LENGTH( `keyword` ) - LENGTH( REPLACE( `keyword`, @word, '' ))) / LENGTH( @word )) AS CNT FROM `table` ORDER BY CNT DESC;
と書けば良い事が分かりました。
前述のサンプル
AWS4g5h6EDRFTGYHUY7jMAAAOL765P2OKRFIJ5678h77
7b4d3kRCCCG3FKK888K4VGT987YDEEE999E8676h
5gTAAAR5FEDEXECTYEFIHFIERI4635BBB65hrDF4
でこのSQLを動かせば、AAAは2回出現しているので、CNT は 2 になるはずです。
では、上記のように複数単語の場合、どのようにSQL文を書けば、
データベースサーバーへの負荷も少なく、1回のSQLで目的の結果を得ることができるのでしょうか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/27 11:05
退会済みユーザー
2019/01/27 11:53 編集