2014-12-05 6 views
1

У меня есть таблица (см. Ниже), которая содержит список друзей. В каждой строке пользователь может быть либо отправителем, либо получателем (запрашивающим/запрашивающим). Затем статус отслеживает их отношения (статус 1 означает, что они друзья). Но поскольку uid может быть как в отправителе, так и в приемнике, он меня пугает.Найти общие совпадающие идентификаторы

================================ 
| sender | reciever | status | 
-------------------------------- 
| testusr1 | testusr2 | 1  | 
| testusr1 | testusr3 | 1  | 
| testusr1 | testusr4 | 0  | 
| testusr1 | testusr5 | 1  | 
| testusr3 | testusr4 | 1  | 
| testusr3 | testusr2 | 1  | 
| testusr5 | testusr3 | 1  | 

Таким образом, в приведенном выше примере, друзья testusr1 являются: testusr2, testusr3 и testusr5. Друзья testusr3 являются: testusr5, testusr4, testusr2, testusr1

Что я ищу это запрос, который получит общие друзья: testusr2 и testusr5

Scavenging из другого ответа я получил здесь, я думал, Я мог бы сделать профсоюз, но я потерял логику я следовал примерно на полпути через ...

SELECT f.uid 
    FROM(
     (SELECT reciever as uid FROM friends where status=1 and sender='$sentuid') 
     UNION 
     (SELECT sender as uid FROM friends where status=1 and reciever='$sentuid') 
    ) f 
    WHERE ... 

Любая помощь будет высоко оценен ...

ответ

0

попробовать что-то вроде - (отредактировал)

SELECT f.uid 
FROM (
    SELECT f1.reciever as uid FROM friends f1 
    WHERE f1.sender = USER1 AND f1.status = 1 
    UNION 
    SELECT f2.sender as uid FROM friends f2 
    WHERE f2.reciever = USER1 AND f2.status = 1 
    ) f 
WHERE f.uid IN (
    SELECT f3.reciever as uid FROM friends f3 
    WHERE f3.sender = USER3 AND f3.status = 1 AND f3.reciever != USER1 
    UNION 
    SELECT f4.sender as uid FROM friends f4 
    WHERE f4.reciever = USER3 AND f4.status = 1 AND f4.sender != USER1 
    ); 

Заменить USER1 и USER3 с вашими 2 идентификаторами пользователя, которые вы хотите, чтобы найти общие друзья

sqlfiddle пример - http://sqlfiddle.com/#!2/b0aaf4/8

0

Это должно сделать трюк. [ОБНОВЛЕНО]

Чтобы найти общих друзей, необходимо установить значения отправителя и получателя. Ниже запрос будет найти взаимные друзей Sender: testusr1 и приемника: testusr3

set @sender_value=testusr1, @receiver_value=testusr3; 

SELECT 
    DISTINCT 
    F1.Mutual_Friends 
    FROM 
    (
    SELECT F.sender Mutual_Friends FROM friends F WHERE F.receiver = @sender_value AND F.status = 1 
    UNION 
    SELECT F.receiver Mutual_Friends FROM friends F WHERE F.sender = @sender_value AND F.status = 1 
    ) F1 
    INNER JOIN 
    (
    SELECT F.sender Mutual_Friends FROM friends F WHERE F.receiver = @receiver_value AND F.status = 1 
    UNION 
    SELECT F.receiver Mutual_Friends FROM friends F WHERE F.sender = @receiver_value AND F.status = 1 
    ) F2 ON 
     F2.Mutual_Friends = F1.Mutual_Friends; 
0

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

SELECT a.reciever 
FROM (SELECT a.sender, a.reciever 
     FROM tableA a 
     WHERE a.sender IN ('testusr1', 'testusr3') AND a.status = 1 
     UNION 
     SELECT a.reciever AS sender, a.sender AS reciever 
     FROM tableA a 
     WHERE a.reciever IN ('testusr1', 'testusr3') AND a.status = 1 
    ) AS A 
GROUP BY a.reciever 
HAVING COUNT(DISTINCT a.sender) > 1 
Смежные вопросы