Получение списка имен друзей из MySQL - PullRequest
1 голос
/ 12 марта 2012

У меня есть таблица с именами друзей;

    friends
id   uid   fid
1     1     2   (1 is a friend of 2 and vice versa)
2     1     3   (1 is a friend of 3 and vice versa)
3     4     1   (1 is a friend of 4 and vice versa)
4     5     1   (1 is a friend of 5 and vice versa)

И соответствующая таблица для пользователей;

  users
uid  name
1    mike
2    john
3    karl
4    mary
5    tony

Кажется, это не сработает:

SELECT name FROM users LEFT JOIN friends ON friends.uid=users.uid WHERE friends.uid='1' OR friends.fid='1'

Каким должен быть мой запрос, чтобы получить все имена друзей Майка?

Ответы [ 6 ]

2 голосов
/ 12 марта 2012

Это должно сработать просто с одним, легко индексируемым запросом;

SELECT name FROM users u
JOIN friends f 
  ON u.uid = f.uid OR u.uid = f.fid
WHERE (f.uid=1 OR f.fid=1) 
  AND u.uid<>1;

Демо здесь .

2 голосов
/ 12 марта 2012

попробуйте один из них:

SELECT a.uid as UserID,
       a.`Name` as UserName,
      c.`Name as FriendsName
FROM users a LEFT JOIN friends b on a.uid = b.uid
    LEFT JOIN users c on b.fid = c.uid

OR

SELECT a.uid as UserID,
       a.`Name` as UserName,
      GROUP_CONCAT(c.`Name`) as FriendsList
FROM users a LEFT JOIN friends b on a.uid = b.uid
    LEFT JOIN users c on b.fid = c.uid
GROUP BY a.uid
2 голосов
/ 12 марта 2012

Непроверенные:

SELECT name from friends LEFT JOIN users on users.uid=friends.fid where friends.uid=1 UNION 
SELECT name from friends LEFT JOIN users on users.uid=friends.uid where friends.fid=1

Это может выглядеть немного странно, если кто-то когда-либо дружил с собой.

1 голос
/ 12 марта 2012

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

SELECT users.*
FROM  (
    SELECT uid FROM friends WHERE fid = 1
    UNION ALL
    SELECT fid FROM friends WHERE uid = 1
    ) f
JOIN   users USING (uid)
0 голосов
/ 12 марта 2012

Я думаю, что это правильно SELECT name FROM users LEFT JOIN friends ON friends.uid=users.uid WHERE friends.uid=1 OR friends.fid=1

0 голосов
/ 12 марта 2012

Поменяйте друзей и пользователей по вашему запросу и Я думаю вы получите то, что хотите.

Другими словами:

SELECT name FROM friends LEFT JOIN users ON friends.uid=users.uid WHERE friends.uid='1' OR friends.fid='1'
...