MySQL: соединение таблицы с самим собой без использования Distinct - PullRequest
1 голос
/ 24 июня 2011

Это моя структура таблицы

  • Имя Имя друга [Varchar]
  • FUID ID друга [Int]
  • UID ID пользователя [Int]

рк [FUID, UID]

Я хочу завести общих друзей из 2 человек. Я попробовал:

SELECT t1.fName,
       t1.fUID 
  FROM friends t1, 
       friends t2 
 WHERE t1.UID = X 
   AND t2.UID = X2

но это не сработало :( Я получаю одни и те же результаты неоднократно.

Некоторые примеры данных

UID  Name  
----------
1    Mark  
2    Eduardo  
3    Dustin  

Friend Table

UID  fUID  fName  
------------------
1    2     Eduardo   
2    1     Mark  
3    1     Mark  
1    3     Dustin 

Ответы [ 5 ]

1 голос
/ 24 июня 2011

Если я вас правильно понимаю, у вас есть два идентификатора пользователя (X1 и X2), и вы хотите найти всех людей, которые дружат с обоими этими людьми.

SELECT f1.fUID, f1.fName
FROM friends f1,
friends f2
WHERE f1.UID = X1
      AND f2.UID = X2
      AND f1.fUID = f2.fUID

Примечание: этоПредполагается, что все отношения с друзьями сохраняются дважды в таблице друзей, по одному в каждом направлении.Если нет, то становится немного сложнее.

0 голосов
/ 24 июня 2011
SELECT
  f.fUID,
  u.Name
FROM (
  SELECT fUID
  FROM (
    SELECT
      CASE WHEN UID  IN (@X, @X2) THEN UID ELSE fUID END AS UID,
      CASE WHEN fUID IN (@X, @X2) THEN UID ELSE fUID END AS fUID
    FROM friends
    WHERE     (UID IN (@X, @X2) OR  fUID IN (@X, @X2))
      AND NOT (UID IN (@X, @X2) AND fUID IN (@X, @X2))
  ) s
  GROUP BY fUID
  HAVING COUNT(DISTINCT UID) = 2
) f
  INNER JOIN users u ON f.fUID = u.UID
0 голосов
/ 24 июня 2011
SELECT t1.fName, t1.fUID FROM friends t1 WHERE t1.UID=X1
Union
SELECT t1.fName, t1.fUID FROM friends t1 WHERE t1.UID=X2

Вы можете получить общих друзей, используя объединенный запрос.

0 голосов
/ 24 июня 2011
select fName
from friends
where uid = FIRST_USER_ID
  and exists (
    select 1
    from friends sfriends
    where sfriends.fid = friends.fid
      and sfriends.uid = SECOND_USER_ID
);
0 голосов
/ 24 июня 2011

Попробуйте:

   SELECT DISTINCT t1.fName,t1.fUID 
     FROM friends t1, friends t2 
    WHERE t1.UID=<USER-ID-1>
      AND t2.UID=<USER-ID-2>
      AND t1.fUID = t2.fUID
      AND t1.UID <> t2.UID

Настройка тестовых данных:

CREATE TABLE Friends
(
    uID INT,
    fuID INT,
    fName VARCHAR(20)
)

INSERT INTO Friends
SELECT '1 ',' 2 ','Eduardo'
UNION
SELECT '2 ',' 1 ','Mark'
UNION
SELECT '3 ',' 1 ','Mark'
UNION
SELECT '1 ',' 3 ','Dustin' 


SELECT DISTINCT t1.fName,t1.fUID 
    FROM Friends t1, Friends t2 
 WHERE t1.UID=2
   AND t2.UID=3
     AND t1.fUID = t2.fUID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...