Список синонимов: какой запрос использовать - PullRequest
0 голосов
/ 24 марта 2012

Мне нужно сделать функцию поиска по синонимам, используя 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.

Но я не могу понять, чтобы сделать запрос ...

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Что-то близко к этому 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 = ?

Поскольку вы хотите проверить две строки имени (оригинал и синоним), вам необходимо объединить таблицу NAMES_TABLE с самой собой через SYNONYMS_TABLE.

1 голос
/ 24 марта 2012

В одном направлении: 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 меняются во второй части второго запроса.

Какой из них вам нужен, зависит от данных.Если вы хотите, чтобы «дорожка» была синонимом «дороги», а не наоборот, вам следует использовать первый метод.Но в этом случае вы должны помнить, что синонимы в обоих направлениях должны быть добавлены дважды, поэтому вы получите:

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

Теперь Road и Street являются синонимами друг друга, но Lane является синонимом.для дороги, дорога не для переулка.Если вы не хотите такого поведения, вам лучше использовать второе, хотя вы можете рискнуть ввести двойные записи, поменяв местами ID_1 и ID_2.Вы должны быть в состоянии предотвратить это, проверив, что ID_2 всегда выше, чем ID_1, никогда не бывает одинаковым или ниже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...