これを試して:
select distinct
url
from
tbl_index a
where
(select count(*) from tbl_index b where a.url=b.url and b.keyword in ('word 1', 'word 2' . . .)) = n
はn
検索するキーワードの数で、「単語 1」、「単語 2」などはキーワードです。
3 つのテーブルを作成することをお勧めします。1 つは一意の URL ごとに 1 つの行があり、数値 ID と URL 名があり、2 つ目のテーブルは一意のキーワードごとに 1 つの行があり、数値 ID とキーワードがあり、相互参照テーブルがあります。すべてのペア url id - キーワード id:
create table urls (
url_id int identity,
url varchar(800),
primary key (url_id)
)
create table keywords (
keyword_id int identity,
keyword nvarchar(50),
primary key (keyword_id)
)
create table urlkeys (
url_id int,
keyword_id int,
primary key (url_id, keyword_id)
)
このようにして、データのサイズを縮小する必要があります。上記のクエリは次のようになります。
select
url
from
urls
where (select count(*) from urlkeys join keywords on urlkeys.keyword_id=keywords.keyword_id where urlkeys.url_id=urls.url_id and keywords.keyword in ('word 1', 'word 2' . . .)) = n
keyword
列にインデックスを付けることをお勧めします
PSこれは単純化されたSQLソリューションの概要ですが、さまざまな人がコメントですでに指摘しているように、これは全文検索ソリューションを使用して解決するのが最善の問題です. ステミング、近接検索、部分単語検索、ワイルドカードなどを実行しようとするとすぐに、SQL ベースのソリューションは不十分になります。