3

私は 6 つのテーブルを持っています。それらを a、b、c、d、e、f と呼びましょう。ここで、すべてのテーブルのすべての列 (ID 列を除く) で特定の単語を検索したいとします。たとえば、'Joe' としましょう。私がしたことは、すべてのテーブルに対して INNER JOINS を作成し、LIKE を使用して列を検索することでした。

INNER JOIN
...
ON
INNER JOIN
...
ON.......etc.
WHERE a.firstname 
~* 'Joe' 
OR a.lastname 
~* 'Joe' 
OR b.favorite_food 
~* 'Joe'
OR c.job
~* 'Joe'.......etc.

結果は正しいです。探していたすべての列を取得します。しかし、ある種のデカルト積も得られます.2行以上でほぼ同じ結果が得られます。

どうすればこれを回避できますか? 結果はWeb検索に表示されるはずなので、各行を1回だけにしたいです。

アップデート

最初に、次のSELECT DISTINCTステートメントを使用して、これが機能するかどうかを判断しようとしました: pastie.org/970959しかし、それでもデカルト積が得られます。これの何が問題なのですか?

4

5 に答える 5

2

試してみSELECT DISTINCTますか?

于 2010-05-20T09:05:13.067 に答える
2

どのような条件でこれを行いますJOINtables? とか持ってますforeign keysか?

たぶん、各テーブルでその単語を個別に見つける必要がありますか?

于 2010-05-20T09:06:19.207 に答える
1

どのようなサーバーを使用していますか? Microsoft SQL Server にはフルテキスト インデックス機能があり (他にもこのような機能があると思います)、リソースをあまり消費しない方法でキーワードを検索できます。

また、テーブルを結合する代わりに UNION を使用することも検討してください。

于 2010-05-20T09:07:16.487 に答える
0

あなたのテーブルを見なければ、ここで起こっていることは、あなたがどこかで一対多の関係を持っているということだけを推測することができます. おそらく、サブクエリですべてを実行し、個別の ID を選択してから、表示するデータを ID で取得する必要があります。何かのようなもの:

SELECT a.*, b.*
FROM (SELECT DISTINCT a.ID
      FROM ...
      INNER JOIN ...
      INNER JOIN ...
      WHERE ...) x
INNER JOIN a ON x.ID = a.ID
INNER JOIN b ON x.ID = b.ID

ただし、次の点に注意してください。

  • これは遅くなり、代わりに全文検索を使用することをお勧めします (RDBMS でサポートされている場合)。

  • 最初にデカルト積ですべてを結合してから OR でフィルター処理するよりも、各テーブルを個別に検索する方が高速な場合があります。

于 2010-05-20T09:08:38.547 に答える
0

あなたのテーブルがエンティティタイプのテーブルである場合、たとえばa人でありb企業である場合、この方法で結果を検索すると(単一クエリ)、デカルト積を回避できないと思います。

すべてのテーブルで特定の単語を検索したいが、おそらく結果を対応するタイプに分けたいとします。右?そうでなければ、ウェブ検索はあまり意味がありません。したがって、'Joe' を検索すると、'Joe' という名前を含む人物、たとえば 'Joe's gym' という名前の会社が表示されます。さまざまなエンティティを検索しているため、検索をさまざまなクエリに分割する必要があります。

本当にこれを 1 つのクエリで実行したい場合は、対応するようにデータベース構造を変更する必要があります。エンティティ ID (PK) とエンティティ タイプ、およびそのエンティティを検索するキーワードのリストを含む何らかの形式の「検索テーブル」が必要になります。例えば:

EntityType, EntityID, Keywords
------------------------------
Person,     4,        'Joe', 'Doe'
Company,    12,       'Joe''s Gym', 'Gym'

そんな感じ?

ただし、検索で 1 種類のエンティティ (たとえば、Person) のみが返され、(その Person に関連するテーブルで) そのキーワードでヒットした Person を返したい場合は異なります。次に、表示するすべてのフィールドを選択してグループ化し、検索対象のフィールドを除外する必要があります。それらを含めると、必然的にデカルト積になります。

ところで、私はここでブレインストーミングをしているだけです。お役に立てば幸いです。

于 2010-05-20T09:16:46.500 に答える