1

他の2つのテーブルのIDを接続するテーブルがある場合、複数のステートメントを照会できるようにしたいと考えています。

私の 3 つのテーブル

destination:
id_destination, name_destination

keyword:
id_keyword, name_keyword

destination_keyword:
id_keyword, id_destination

最後の 1 つは、目的地をキーワードに関連付けるために、目的地とキーワード テーブルの ID を接続します。

キーワードに基づいて目的地を取得するクエリは、次のようになります。

SELECT destination.name_destination FROM destination
            NATURAL JOIN destination_keyword 
            NATURAL JOIN keyword
            WHERE keyword.name_keyword like _keyword_

複数のキーワードを照会することは可能ですか。たとえば、リスト内のすべてまたは一部のキーワードに一致する目的地を取得し、sunny, ocean, fishing一致数で並べ替えたいとします。どうすれば前進できますか?テーブルを再構築する必要がありますか? 私はSQLが初めてで、いくつかの入力が非常に欲しいです。

4

3 に答える 3

1

テーブルの結合を次の順序で並べ替えkeyword、宛先が結合された回数のカウントを使用します。

select
    d.id_destination,
    d.name_destination,
    count(d.id_destination) as matches
from keyword k
join destination_keyword dk on dk.keyword = k.keyword
join destination d on d.id_destination = dk.id_destination
where name_keyword in ('sunny', 'ocean', 'fishing')
group by 1, 2
order by 3 desc

name_keywordこのクエリは、値が「sunny」のような単一の単語であることを前提としています。


自然結合の使用はお勧めできません。テーブル構造が変更され、2 つの自然結合テーブルが変更されて同じ名前の列が追加されると、クエリが突然機能しなくなるためです。また、結合条件を明示的に宣言することにより、コードの読者はテーブルがどのようにジョーンズであるかをすぐに理解し、必要に応じて非キー条件を追加するように変更できます。

キー列のみが同じ名前を共有することを要求することも制限的です。これは、単に「name」ではなく「name_keyword」のような不自然な列名が必要になるためです。サフィックス「_keyword」は冗長であり、値を追加せず、必要なためにのみ存在します。自然な結合を使用しているためです。

自然結合は入力をほとんど節約せず (多くの場合、全体的に入力を増やす原因となります)、結合の種類と名前に制限を課し、脆弱です。

それらは避けるべきです。

于 2013-05-06T18:48:56.140 に答える
0

次のようなことを試すことができます。

SELECT dest.name_destination, count(*) FROM destination dest, destination_keyword dest_key, keyword key 
WHERE key.id_keyword = dest_key.id_keyword
AND dest_key.id_destination = dest.id_destination
AND key.name_keyword IN ('sunny', 'ocean', 'fishing')
GROUP BY dest.name_destination
ORDER BY count(*), dest.name_destination

テストしていませんが、正しくない場合は、それを達成する方法が示されるはずです。

于 2013-05-06T18:06:33.117 に答える
0

複数の LIKE ステートメントを実行できます。

Column LIKE 'value1' OR Column LIKE 'value2' OR ...

または、正規表現の一致を実行できます。

Column LIKE 'something|somtthing|whatever'

一致数で並べ替えるコツは、GROUP BY 句と ORDER BY 句を理解することです。すべてに 1 つのカウントが必要か、何かごとに 1 つのカウントが必要かのいずれかです。したがって、最初のケースでは、COUNT 関数を単独で使用します。2 番目のケースでは、GROUP BY 句を使用して、カウントしたいもの/カテゴリを「グループ化」します。ORDER BY は非常に簡単です。

あなたが提供した情報に基づいて、テーブル構造は問題ないと思います。

お役に立てれば。

免責事項: 私の構文は正確ではありません。

于 2013-05-06T18:20:32.507 に答える