SELECT
b.BusinessId,
b.BusinessName
FROM
tblBusiness AS b
INNER JOIN tblBusinessTagLink AS l ON l.BusinessId = b.BusinessId
INNER JOIN tblTags AS t ON t.TagId = l.TagId
WHERE
t.TagName IN ('Technology', 'Office Supplies')
GROUP BY
b.BusinessId,
b.BusinessName
これはカテゴリのいずれかのいずれかであるすべての事業を選択します。唯一の両方のカテゴリのものを選択するには、あなたは(メートルを表現するために3つのテーブルを:nの関係)を使用している
HAVING COUNT(*) = 2
メソッドを追加することができ、このタスクを解決するための標準的な方法で、あなたはそれを維持することができます。
個人的には、テーブル名に「ハンガリー表記」を使用しないでください(複数の表が複数でない場合は特に「タグ」ではなく複数の表名を使用しません)。下記の最初のコメントに答える
:より大きなデータセットの場合
は、このクエリのパフォーマンスは、インデックスに依存しています。すべての主キーには自然にインデックスが必要です。 tblBusinessTagLink
には、両方のフィールドをカバーする合成索引と、複合索引で最初に表示されないフィールドの索引を追加する必要があります。
アイデアが悪いのは、フィールドの開始検索以外のLIKE条件でインデックスを使用できない(つまり、データセットの増加に伴ってパフォーマンスが急激に低下する)ためであり、部分的にはWHERE ','+keywords+',' LIKE '%,technology,%'
または部分一致/偽陽性を取得します。
また、TagId
でクエリするのが少し効率的かもしれません。この方法は、あなたが完全に登録しようから一つのテーブルを削除することができます。
FROM
tblBusiness AS b
INNER JOIN tblBusinessTagLink AS l ON l.BusinessId = b.BusinessId
WHERE
l.TagId IN (1, 2)
あなたはしかしTagName
で照会する場合は、このフィールドにインデックスが同様に絶対に必要になります。
ハンガリーの記法と複数の名前に関する注釈に感謝します。私はまだAccessデータベースを構築している間に学んだことをすべて取り消そうとしています。ビジネスエントリの数が増えるとこのクエリのパフォーマンスは低下しますか?または、選択されたタグの数が増加すると、または両方?私はユーザーに、5〜6個のタグが適用されているレコードを選択するオプションを提供する予定です。ときには、タグを取得してキーワードフィールドに格納する方が速いのではないかと思うことがあります。b.BusinessID、b.BusinessNameをtblBusinessから選択します。 '%technology%'のようなキーワードと... – HK1
その他のコメントを見る私の答えで。 – Tomalak