Самореференциальная логика MYSQL с самостоятельным объединением - PullRequest
0 голосов
/ 02 февраля 2012

У меня есть таблица с именами друзей, в которой есть id и name, и таблица самостоятельного соединения, называемая дружбой, в которой хранятся отношения, которые включают в себя friend_id и friend2_id.как я могу получить имена связанных друзей, если дано имя определенного друга

пример

id name
1  jack
2  kurt
3  jim

и

friendship
f_id f1_id
1    3 

Так что, если я дам 'jack я должен получить jim обратно

1 Ответ

0 голосов
/ 02 февраля 2012

Вы можете сделать это одним запросом или двумя запросами, в зависимости от того, что вы хотите выполнить.

Простым может быть:

SELECT
  f_id,
  f1_id
FROM
  friendship
WHERE
  f_id=1
  OR
  f1_id=1

И тогда вы можете получить конкретныйдрузья с таким утверждением, как:

SELECT name FROM people WHERE id IN(2,3)

Альтернативой является самосоединение, но сложная часть здесь заключается в том, что ваш идентификатор может быть как в f_id, так и в f1_id, так что потребуется какая-то команда UNION или что-то вроде (не проверено):

SELECT
  p1.name,
  p2.name,
FROM
  friendship
  INNER JOIN
    people AS p1
      ON friendship.f_id = people.id
  INNER JOIN
    people AS p2
      ON friendship.f1_id = people.id
WHERE
  p1.id=1 OR p2.id=1

Я бы тщательно проверил скорость этих опций, поскольку они довольно тяжелы для огромного количества записей.Если вы измеряете, вам нужно больше производительности, попробуйте альтернативу.Например, когда вы всегда помещаете наименьший people.id в f_id, а больший - в f1_id, вы можете выполнить 2 запроса, которые вы объединяете.Альтернативой может быть денормализация небольшого бита для кеширования результатов, если они вам часто нужны.

Это сэкономит вам множество соединений, например, если вы добавите имена в таблицу дружбы:

SELECT
  f_id,
  f1_id,
  f_name,
  f1_name
FROM
  friendship
WHERE
  f_id=1
  OR
  f1_id=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...