2009-07-01 9 views
0

私は、次の表しているSQL 2008 Expressデータベースを、持っている:検索SQLクエリのベストプラクティスとは?

CREATE TABLE Videos 
    (VideoID bigint not null, 
    Title varchar(100) NULL, 
    Description varchar(MAX) NULL, 
    isActive bit NULL ) 

CREATE TABLE Tags 
    (TagID bigint not null, 
    Tag varchar(100) NULL) 

CREATE TABLE VideoTags 
    (VideoID bigint not null, 
    TagID bigint not null) 

今、私はこれらのテーブルに対してワード(すなわち、ビヨンセヘイローミュージックビデオ)を検索するためのSQLクエリを必要とします。ビデオは持って

:説明正確な語句については0.5ポイント

  • は、タグの正確なフレーズの場合は0.4ポイント
  • を取得するタイトルフレーズの場合

    • を取得するには、すべてのタイトルのために0.3ポイント
    • を取得します言葉は0.2ポイントを取得します
    • 説明については、すべての単語が0.2ポイントを取得するタイトル1つ以上の単語については
    • ます詳細については0.1ポイント
    • を得る1つ以上の単語では0.1ポイント

  • を取得し、私が点に基づいてこれらのビデオを表示します。このためのSQLクエリは何でしょうか? LINQクエリはより良いでしょう。

    あなたがこれを達成するためのより良い方法を知っていれば、助けてください。

    +3

    は、なぜあなたは良い解決策だと思うものに起動していない、と私たちはあなたのポインタとするのに役立つヒントを与えることができますか? –

    +0

    私は上記の文章を達成したいと言っています –

    +1

    はい、あなたはまだ仕事をしていますか?あなたはそれを試しましたか? –

    答えて

    0

    これを全文検索する必要があります。それ以外

    あなたはテーブルごとに検索クエリを作成して、重みのためのケースを使用することができます。この方法は非常にかさばり、実際には良いものではありません。

    select case when Title = 'yourPhrase' then 0.5 when Title like '%yourPhrase%' then 0.1 when Title like '%your% %Phrase%' then 0.2 end as Weight 
    from yourTable 
    where Title like %yourPhrase% 
    
    1

    私の知る限り、SQL Serverのフルテキスト機能は、多言語の列と表には適していません。

    私はプロジェクトのために似たような状況でも取り扱っております。私はまだ解決策を見つけることができませんでした。

    私はMladen'sにも同様のアプローチを使用します。私は少し遅いですが、私はこれらのスコアを合計します。

    select (case when Title = 'yourPhrase' then 0.5 else 0 end) + 
    (case when Title like '%yourPhrase%' then 0.1 else 0 end) + 
    (case when Title like '%your% %Phrase%' then 0.2 else 0 end) as Weight 
    from yourTable 
    where <your other filters but not a 'like' operator> 
    order by Weight desc 
    

    where節でlike演算子を使用すると、非常に高価になります。だから、私の意見では、すべてを選択して後で注文する方が良いかもしれない。