2012-03-24 8 views
0

Ich muss eine Synonymsuchfunktion mit MySQL machen. HierListe von Synonymen: Welche Anfrage zu verwenden

ist der Tabellen-Struktur:

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 

Ich will es so arbeiten: ein Wort in einer Form ein, die in dem Abschnitt ist schickt mir alle Worte entsprechen, in denen ihre Indizes in der Synonyme Tabelle sind , als ID_1 oder ID_2.

Aber ich kann nicht herausfinden, um die Anforderung zu machen ...

Vielen Dank für Ihre Hilfe.

Antwort

1

Ein Richtungs: ID_1 ein Name ist, ist ID_2 ein Synonym:

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 

Zwei Richtungs: entweder ID_1 oder ID_2 können einen Namen enthalten, während der andere das Synonym ist.

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 

Hinweis ID_2 und ID_1 werden im zweiten Teil der zweiten Abfrage umgekehrt.

Welches Sie benötigen, hängt von den Daten ab. Wenn "Spur" ein Synonym für "Straße" sein soll, aber nicht umgekehrt, sollten Sie die erste Methode verwenden. Aber in diesem Fall werden Sie müssen bedenken, dass Synonyme in beiden Richtungen zweimal hinzugefügt werden sollte, so dass Sie erhalten:

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

Jetzt Straße und Straße sind jeweils andere Synonyme, aber während Lane ist ein Synonym für Straßen Straße ist nicht für Lane. Wenn Sie dieses Verhalten nicht möchten, verwenden Sie besser das zweite, obwohl Sie riskieren können, doppelte Datensätze einzugeben, indem Sie ID_1 und ID_2 austauschen. Sie sollten dies verhindern können, indem Sie überprüfen, ob ID_2 immer höher als ID_1 ist, niemals gleich oder niedriger.

+0

Es ist genau das, was ich brauchte. Danke für die Anfragen und die klaren zusätzlichen Erklärungen. – mlh

1

Etwas nah an diesem JOIN sollte gut funktionieren.

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 = ? 

Da Sie zwei Namen Zeilen überprüfen möchten (das Original und das Synonym), müssen Sie die Tabelle NAMES_TABLE mit sich selbst über die SYNONYMS_TABLE beizutreten.

Verwandte Themen