1

説明するために問題を単純化します。

ユーザーが投稿したテキスト メッセージを含むテーブルと、キーワードを含む別のテーブルがあります。

  • ユーザーごとに、テキスト メッセージでキーワードが見つかった回数を表示したいと考えています。
  • テキストメッセージにキーワードが見つからない場合、結果にキーワードを表示したくありません。
  • 大文字と小文字を区別しないでください。すべてのキーワードは下に下げられていますが、メッセージでは下と上の文字を見つけることができます。

私の説明が十分に明確であるかどうか確信が持てないので、ここに SQLFiddle を示します。 http://sqlfiddle.com/#!2/c402a

誰でも私を助けてくれることを願っています。

4

2 に答える 2

1

探していたものが見つかりました。私にとっては簡単ではありませんでしたが、ここに私のクエリがあります:

 SELECT t_msg.msg_usr, 
        t_list.list_word, 
        count(t_list.list_word),       
        t_msg.msg_text       
 FROM t_msg
 INNER JOIN t_list
 ON LOWER(t_msg.msg_text) LIKE CONCAT("%", t_list.list_word, "%")
 GROUP BY t_msg.msg_usr, t_list.list_word;

SQLFiddle があります: http://sqlfiddle.com/#!2/ba052/8

于 2013-10-23T02:55:02.257 に答える
0

これをクエリで解決しようとしないことをお勧めします。それを実行するクエリを作成することは可能です。そのようなクエリは、各キーワードのメッセージ テーブルを個別にスキャンし、カウント (またはグループ化できる行) を生成しますが、これはスケーリングされないか、意味のある信頼性がありません。言語検索の。

やりたいことは次のとおりです。

  1. (user_id, keyword_id) をこのユーザーのメッセージ内のこのキーワードの数にマップするテーブルを作成します。t_keyword_count としましょう。
  2. メッセージを受信するたびに、メッセージをデータベースに保存する前に、気になるすべてのキーワードを検索します (スペルミスなどを考慮した適切なテキスト検索ライブラリを使用します)。このメッセージの (user_id) を知っている必要があります。
  3. その時点で、メッセージをデータベースに追加する準備が整い、このメッセージに含まれるキーワードを含む (keyword_id) の配列が得られます。
  4. トランザクションで、メッセージを t_msg テーブルに挿入し、update/insert for (user_id,keyword_id) を実行して、value=value+1 (同じメッセージで同じキーワードを複数回カウントする必要がある場合は +n) にします。 ) t_keyword_count テーブルの場合。

既存のデータに対して上記を実行しなければならないという問題を解決しようとしている場合は、最初にその t_keyword_count テーブルを構築するためだけに手動で行うことができます (合計でいくつのキーワードがあるかによって異なりますが、多くの場合でも、これはスクリプト化できます)。ただし、t_msg.msg_text フィールドをテキスト検索に適したフィールドに変更 (またはミラーリング) し、SQL テキスト検索機能を使用してキーワードを検索する必要があります。

于 2013-10-23T02:47:41.977 に答える