2012-03-24 1 views
0

MySQLを使用して同義語検索機能を作成する必要があります。ここで同義語の一覧:どのようなリクエストを使用する

は、テーブルの構造である:

NAMES_TABLE   SYNONYMS_TABLE 
------------   -------------- 
ID | NAME    ID_1 | ID_2 
---+--------   ------+------- 
1 | NAME_A    1 | 2 
2 | NAME_B    2 | 1 
3 | NAME_C    1 | 3 
4 | NAME_D    3 | 1 
5 | NAME_E    4 | 5 
         5 | 4 

は、私はそれがこのように仕事をしたい:そのインデックスは同義語表にある対応する私を送信するすべての単語、であるフォームに単語を入力します、ID_1またはID_2として

しかし、私は...リクエストをするためにあなたの助けのための

感謝を把握することはできません。

答えて

1

一つの方向性は:ID_1は名前で、ID_2は同義語です:

select 
    sn.NAME 
from 
    NAMES_TABLE n 
    inner join SYNONYMS_TABLE s on s.ID_1 = n.ID 
    inner join NAMES_TABLE sn on sn.ID2 = s.ID_2 
where 
    n.NAME = :NAME 

二つの方向性:他のはその同義語である一方、ID_1またはID_2いずれかが、名前を含めることができます。

select 
    sn1.NAME 
from 
    NAMES_TABLE n1 
    inner join SYNONYMS_TABLE s1 on s1.ID_1 = n1.ID 
    inner join NAMES_TABLE sn1 on sn1.ID = s1.ID_2 
where 
    n1.NAME = :NAME 
union 
select 
    sn2.NAME 
from 
    NAMES_TABLE n2 
    inner join SYNONYMS_TABLE s2 on s2.ID_2 = n2.ID 
    inner join NAMES_TABLE sn2 on sn2.ID = s2.ID_1 
where 
    n2.NAME = :NAME 

注意ID_2とID_1は、2番目のクエリの2番目の部分で反転しています。

必要なデータはデータによって異なります。 「車線」を「道路」の同義語にしたいが、それ以外の方法ではない場合は、最初の方法を使用する必要があります。しかし、その場合には、あなたは両方向の同義語を二回追加しなければならないことを覚えておく必要がありますので、あなたが買ってあげる:

NAMES_TABLE   SYNONYMS_TABLE 
------------   -------------- 
ID | NAME    ID_1 | ID_2 
---+--------   ------+------- 
1 | Road    1 | 3 
2 | Lane    3 | 1 
3 | Street   2 | 1 

今の道と街はお互いの同義語ですが、レーンながら道路の同義語です、道路は車線用ではありません。 ID_1とID_2を入れ替えることで二重レコードを入力する危険性がありますが、その動作をしたくない場合は、二番目の行を使用することをお勧めします。 ID_2が常にID_1よりも高く、決して同じでも低くてもないことを確認することで、これを防ぐことができます。

+0

これは私が必要としていたものです。リクエストと明確な追加説明に感謝します。 – mlh

1

このJOINに近いものはうまくいくはずです。

SELECT n1.NAME 
FROM NAMES_TABLE n1 
JOIN SYNONYMS_TABLE s1 
    ON s1.ID_1 = n1.ID 
JOIN NAMES_TABLE n2 
    ON s1.ID_2 = n2.ID 
WHERE n2.NAME = ? 

あなたは2つの名前の行(オリジナルと同義語)をチェックしたいので、あなたはSYNONYMS_TABLEを経由して、それ自体で、テーブルNAMES_TABLEに参加する必要があります。

関連する問題