1

id、title、description、keywordsの列を含むcakesというテーブルがあります。また、keywordsというテーブルがあり、ケーキが親になっています。キーワードテーブルには、idとkeywordの2つの列が含まれています

2つのクエリが必要です:UPDATED

  1. チョコレート、ヘーゼルナッツ、イチゴなどの材料を入力する場合(コンマで区切ることもできます)、3つのキーワードすべてを含むケーキを検索して結果を表示するには、クエリが必要です。3つすべてを含むケーキのみを表示します。一致するケーキがない場合は、何も見つからないというメッセージが必要です。

  2. 検索ボックスに「似たようなケーキを探す」というラベルがあります。人がバニララズベリーまたは例を入力した場合、クエリはデータベースでケーキを見つけ、そのキーワードを他のケーキのキーワードと照合して結果を表示する必要があります。同じキーワードを持つケーキのみを表示します。

これらのクエリの書き方がわからない。どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

1

データベースが「キーワード」を行に入れるのではなく、区切られた長い文字列フィールドを使用する必要がある場合は、LIKE 演算子を使用する必要があります。

[keywords]列が次のようにフォーマットされていると仮定します。

「チョコレート、ガナッシュ、ストロベリー」

「似ている」ケーキは次のように検索できます。

SELECT
    columns
FROM
    table t
WHERE
    t.[keywords] LIKE '%chocolate%'
    OR t.[keywords] LIKE '%cheesecake%'

ただし、スキーマを変更できる場合は、そうします。正規化されたキーワード行の検索は、DB がテキストを使用して解析するよりもはるかに効率的かつ高速です。LIKE

keywords 親テーブルを ID で参照するtableを作成できれば、a を使用して等値検索を行うことができますJOIN。これは優れていると思います。

ID、ParentId、Keyword の 3 つの列がある場合があります。

編集:更新に基づいて、cakewords検索可能なテーブルがあります。

INこれはテストされておらず、句を使用しないより効率的な方法がある可能性があります。しかし、アイデアは、特定のケーキのすべてのキーワード ID を知っているということです。次に、そのコレクション内のキーワードを持つ他のケーキを探しています。

SELECT
    columns
FROM
    cake AS cs
JOIN
    cakewords AS csw
        ON csw.[cakeid] = cs.[id]
WHERE
    csw.[wordid] IN
        (SELECT
            cw.[wordid]
        FROM
            cakewords AS cw
        JOIN
            cakes AS c
                ON c.[id] = cw.[cakeid]
        WHERE
            c.[id] = @pMyCurrenctCakeId
        (

EDIT2:これは良い関連する質問です:

タグ/キーワード マッチングの最適なソリューションは何ですか?

内の回答に基づいて、これを試すことができます:

SELECT DISTINCT
    c.[id]
FROM
    cakewords AS cw1
INNER JOIN cakewords cw2 
    ON cw2.[wordid] = cw1.[wordid]
INNER JOIN cake AS c 
    ON c.[id] = cw.[cakeid]
WHERE
    cw1.[cakeid] = @current_cake_id
于 2013-02-06T16:29:28.907 に答える