0

Web サイトのコンテンツ テーブルを検索し、関連性に基づいて結果を返す SQL が少しあります。

SELECT *, 
( (1.3 * (MATCH(strTitle) AGAINST ('+query+string' IN BOOLEAN MODE))) + (0.6 * (MATCH(txtContent) AGAINST ('+query+string' IN BOOLEAN MODE)))) AS relevance 
FROM content 
WHERE (MATCH(strTitle,txtContent) AGAINST ('+query+string' IN BOOLEAN MODE) ) 
ORDER BY relevance DESC 

これを拡張して、他の 2 つのテーブルを含める必要があります。

テーブル trade_members の 2 つのフィールドを検索する必要があります。

会社名 | 連絡先

およびテーブル ニュースの 2 つのフィールド:

ニュースのタイトル | news_content

関連性の高い順に結果をまとめて表示します。これらのテーブルを結果に組み込むにはどうすればよいですか?

4

1 に答える 1

0

解決策は、3 つの選択の UNION です。しかし、最初にそれらを分析しましょう。

これまでのところ、

SELECT *, {formula} AS relevance FROM content WHERE {cond} ORDER BY relevance DESC

ここで、さらに 2 つの選択が必要になります。

SELECT *, {formula} AS relevance FROM trade_members WHERE {cond} ORDER BY relevance DESC
SELECT *, {formula} AS relevance FROM news WHERE {cond} ORDER BY relevance DESC

これら 3 つのステートメントを個別に実行すると、異なる列が返されることがわかります。次に、それらの列を統合する必要があります。テーブル構造についての詳細がなければ、それがどのように見えるかについてのヒントを提供することしかできません.

SELECT 'content' as type, contentID as id, strTitle     as title, txtContent   as content, {formula} AS relevance FROM content WHERE {cond} ORDER BY relevance DESC
SELECT 'member'  as type, memberID  as id, company_name as title, contact_name as content, {formula} AS relevance FROM trade_members WHERE {cond} ORDER BY relevance DESC
SELECT 'news'    as type, newsID    as id, news_title   as title, news_content as content, {formula} AS relevance FROM news WHERE {cond} ORDER BY relevance DESC

これで、3 つすべての選択で同様の結果が得られるはずです。さらに重要なことは、3 つすべてで同じ列名が表示され、各行でデータベース内のどのデータを表しているかを識別できるようになるはずです。コンテンツ 17、つまり会社 33、ニュース 1776 です。

これで、3 つすべてに対してユニオンを実行できます。

(1st select) UNION (2nd select) UNION (3rd select) ORDER BY relevance DESC

ただし、ファイルの並べ替えが必要な4 つの一時テーブルを実際に作成しているため、これはかなり遅くなる可能性があることに注意してください。実際には必要ありません。

于 2013-02-25T18:03:36.680 に答える