SQL-запрос для общих друзей - PullRequest
1 голос
/ 15 июля 2011

Моя структура таблиц MySQL выглядит следующим образом.

USER
uid

FRIENDS
fuid,fuid2,fapproved

Для каждой дружеской связи я вставляю 2 записи в ДРУЗЬЯ.Если пользователь 1 является другом пользователя 2, то следующие строки вставляются в ДРУЗЬЯ

1,2,1

2,1,1

1,3,1

3,1,1

2,3,1

3,2,1

Идентификатор пользователя 3 является другом идентификатора пользователя 1 и идентификатора пользователя 2

Как получить идентификатор пользователя 3в одном sql запросе?

Ответы [ 6 ]

2 голосов
/ 15 июля 2011

Учитывая двух пользователей @ friend1 и @ friend2, найдите всех пользователей, которые являются их общими друзьями:

SELECT user.uid
FROM user
WHERE EXISTS(
    SELECT TOP 1 1 
    FROM Friends 
    WHERE Friends.fuid = @friend1 AND Friends.fapproved = 1 
      AND Friends.fuid2 = User.uid
  )
  AND EXISTS(
    SELECT TOP 1 1 
    FROM Friends 
    WHERE Friends.fuid = @friend2 AND Friends.fapproved = 1 
      AND Friends.fuid2 = User.uid
  )
1 голос
/ 17 декабря 2014
$query = "SELECT DISTINCT a.* FROM user  a, visitor b, visitor c WHERE b.user_id = c.visitor_id  AND b.visitor_id = a.user_id AND c.user_id = a.user_id AND b.user_id=65";

Я попробовал это. это работает.

1 голос
/ 15 июля 2011

Попробуйте это:

SELECT DISTINCT a.*
    FROM user  a, friends b, friends c
WHERE b.fuid = c.fuid2
    AND b.fuid2 = a.uid
    AND c.fuid = a.uid
    AND b.fapproved = 1
    AND c.fapproved = 1

Тестовый скрипт (пробовал в MS SQL ..):

CREATE TABLE #USER
(
    uid INT
)

INSERT #USER VALUES(1)
INSERT #USER VALUES(2)
INSERT #USER VALUES(3)


CREATE TABLE #FRIENDS
(
    fuid INT,
    fuid2 INT,
    fapproved  INT
)


INSERT #FRIENDS VALUES(1,2,1)
INSERT #FRIENDS VALUES(2,1,1)
INSERT #FRIENDS VALUES(1,3,1)
INSERT #FRIENDS VALUES(3,1,1)
INSERT #FRIENDS VALUES(2,3,1)
INSERT #FRIENDS VALUES(3,2,1)


SELECT DISTINCT a.*     
    FROM #user  a, #friends b, #friends c 
 WHERE b.fuid = c.fuid2     
     AND b.fuid2 = a.uid     
   AND c.fuid = a.uid     
   AND b.fapproved = 1     
     AND c.fapproved = 1 
0 голосов
/ 08 мая 2015

Я только запускаю MySQL и столкнулся с этой проблемой.

personID    friendID
6           10
6           2
6           3
8           1
8           2
8           3

/*  query for friends   */
select f.personID, p.personID, firstName, lastName
from person p
inner join friends f on f.friendID = p.personID
where f.personID = 6;

/*  query for common friends    */
select f1.personID 'personID 1', f2.personID 'personID 2', f1.friendID 'common friend'
from person p
inner join friends f1 on f1.friendID = p.personID
inner join friends f2 on f2.friendID = p.personID
where f1.personID = 6 and f2.personID = 8 and f1.friendID = f2.friendID;

результат:

personID 1    personID 2    common friend
6             8             2
6             8             3

хотя это не является прямым решением вашей проблемы, вы можете основать решениездесь.

0 голосов
/ 11 мая 2012

IMO, более интуитивно понятно найти общих друзей с помощью самостоятельного объединения на столе дружбы

SELECT a.fuid2 FROM facebook_friendships AS b
    ON a.fuid = :user_a AND b.fuid = :user_b AND a.fuid2 = b.fuid2
    AND a.fapproved = 1 AND b.fapproved = 1

Вот важные условия на английском языке:

  • a.fuid =: user_a - пользователь A дружит с пользователем X в дружбе A
  • b.fuid =: user_b - пользователь B дружит с пользователем Y в дружбе B
  • a.fuid2 = b.fuid2 - пользователь A и пользователь B дружат с одним и тем же пользователем (т. Е. X и Y - один и тот же пользователь)

Таким образом, вы в основном захватываете все строки, которые соответствуют условиям, которые я перечислил выше. Вы можете получить повторяющиеся результаты, поэтому было бы неплохо добавить DISTINCT вокруг a.fuid2.

0 голосов
/ 15 июля 2011
$query = "SELECT f.fuid, f.fuid2 FROM FRIENDS f, USER u WHERE (f.fuid = u.uid or f.fuid2 = u.uid) AND (u.uid = ".$uid.";");

это то, что вы ищете?

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