Как вывести список общих друзей?

Здравствуйте!
Есть 2 таблицы:
users: d4b4806b04e1423e96d027ae892ce4ab.pngfriends: f345744fbf684e3a9244fa2802059ce8.png

Необходимо вывести общих друзей пользователей Саши (id 1) и Димы (id 49519). Исходя из таблицы, общие друзья у них Петя (id 2) и Вася (id 3).
Список всех друзей пользователя, вывожу таким запросом:
$id  = '49519'; # id пользователя
$userid = '1'; # Мой id

$rows = $db->selectPage($total, "SELECT * FROM ?_friends f1
                                         LEFT JOIN ?_friends f2 ON (f1.friend1 = f2.friend2 AND f2.friend1 = f1.friend2) 
                                         LEFT JOIN ?_users u ON (f1.friend2 = u.user_id OR f2.friend1 = u.user_id)
                                         WHERE f1.friend1 = ".$id."
                                         UNION 
                                         SELECT * FROM ?_friends f1
                                         RIGHT JOIN ?_friends f2 ON (f1.friend1 = f2.friend2 AND f2.friend1 = f1.friend2)
                                         LEFT JOIN ?_users u ON (f1.friend1 = u.user_id OR f2.friend1 = u.user_id)
                                         WHERE f2.friend2 = ".$id.");

Гуглил по этой теме, находил обсуждения, но не получается подогнать под свой запрос.
Подскажите пожалуйста, как мне переделать запрос, чтобы вывести список общих друзей?
Заранее благодарю!
  • Вопрос задан
  • 359 просмотров
Решения вопроса 1
unitby
@unitby
Если совсем не оптимизировано то вот так как пример:
select * from users where id in (
select f1 from (
select friends.friend1 as f1 from friends where friends.friend2 = 1
UNION ALL
select friends.friend2 from friends where friends.friend1 = 1) as s1
where f1 in (
select friends.friend1 from friends where friends.friend2 = 49519
UNION ALL
select friends.friend2 from friends where friends.friend1 = 49519
) )


Если нужно оптимизировано, то покрутить explain
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы