У меня есть таблица с именами друзей;
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'
Каким должен быть мой запрос, чтобы получить все имена друзей Майка?
Это должно сделать это просто отлично с помощью простого, простого для индексирования запроса;
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;
Демо здесь .
Непроверенные:
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
Это может показаться немного странным, если кто-нибудь дружит с самим собой.
попробуйте один из них:
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
ИЛИ
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
Как и в вашем предквалифицированном вопросе , вам нужно прикрыть оба внешних ключа к таблице пользователей, чтобы получить всех своих друзей:
SELECT users.* FROM ( SELECT uid FROM friends WHERE fid = 1 UNION ALL SELECT fid FROM friends WHERE uid = 1 ) f JOIN users USING (uid)
Переключите друзей и пользователей в ваш запрос, и я думаю, вы получите то, что хотите.
Другими словами:
SELECT name FROM friends LEFT JOIN users ON friends.uid=users.uid WHERE friends.uid='1' OR friends.fid='1'
Я думаю, что это правильно SELECT name FROM users LEFT JOIN friends ON friends.uid=users.uid WHERE friends.uid=1 OR friends.fid=1