Intereting Posts
Работать вокруг магических цитат или просто убедиться, что они выключены? Два запроса mysqli Подобные изображения – как их сравнить PHP cURL Content-Length и Content-Type неправильные Как добавить пару ключевых значений в многомерном массиве без добавления индекса в php Персонализация Laravel, связанная с проблемой внешнего ключа postgresql nextval вопрос о последовательностях WordPress ACF: как добавить строки в поле ретранслятора, прикрепленные к пользователю с помощью настраиваемого кода (PHP) Как заставить страницу не кэшироваться в PHP? Невозможно связать две таблицы MySQL (внешние ключи) как объединить две захваченные переменные, используя preg_match_all? Неустранимая ошибка: вызов неопределенной функции mysql_connect () в C: \ Apache \ htdocs \ test.php в строке 2 время работы ресторана с таблицей базы данных в формате для чтения человеком с использованием php Как загрузить LARGE-файлы на YouTube Функция даты в PHP Не работает должным образом

Получение списка имен друзей из MySQL

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

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