2011-08-06 7 views
0

私はここに質問を見てきましたが、特に私が達成しようとしているものと一致する答えを見つけることができませんを検索するためのいくつかの他の方法...SQLマッチに対して、または二つのテーブル

基本的に私が持っていますFAQ情報を格納するSQLテーブル。問題の表は下にあり、主キーは太字で示しています。

表:質問、 フィールズ:id_question、質問、答え、状態、など......

表:question_tags、 フィールズ:id_questionタグ

テーブル:タグ フィールド:タグ

question_tagsテーブルは次のとおりです。本質的に質問テーブルとタグテーブルとの間のリンク(すなわち、多くから多く)。

私はSQL MATCH AGAINSTのようなものを実装しています。ユーザーが検索ボックス(PHP)に質問を入力すると、システムは質問テーブルを検索し、検索語のキーワードの質問を検索します。私はこれを動作させることができますが、私ができるようにしたいのは、検索内のタグを含めることです。この理由は、同じ質問が異なる言葉を使用することができるいくつかの異なる方法があると私は信じています。タグは、検索時に質問を補うものです。 SQL内でMATCH AGAINST関数を使用することは不可能なので、私は固執しています。

この制限はありますか?

または、上記のように別のテーブルの別の列(3番目のテーブルにリンクされている)に各タグを配置する代わりに、質問表にタグ文字列全体の別のフィールドを作成するだけでいいですか?

他にも他に何か提案がありますか?

解決策は大きなデータセットでは機能しませんが、ソリューションがスケーラビリティを持つ場合に役立ちます。

おかげ

答えて

0

タグは、このユースケースのための非正規化のための良い候補かもしれません。

一つの可能​​性は

SELECT * FROM 
(
SELECT Question, Answer, Status, MATCH(title,category) AGAINST ('keyword') as rank 
FROM questions 
WHERE MATCH(Question,Answer) AGAINST ('Keyword') 
UNION 
SELECT Question, Answer, Status, MATCH(Tag) AGAINST ('keyword') 
FROM questions Q 
INNER JOIN question_tags QT 
    ON Q.id_question = QT.id_question 
INNER JOIN tags T 
    ON QT.id_tag = T.id_tag 
WHERE MATCH(Tag) AGAINST ('keyword') 
) R 
ORDER BY rank 

は基本的にタグの問題/解答と他に対するFTの検索を行うと、結果セットを合併すると、その後のランクによってソートするようなものになるだろう。

関連する問題