Вы можете сделать это одним запросом или двумя запросами, в зависимости от того, что вы хотите выполнить.
Простым может быть:
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