Есть таблица users и friends users - id (int) 10 auto_increment - login (varchar) 50 - password (varchar) 35 1, Frenk, password 2, Richard, password 9, James, password 10, Alex, password friends - friend_id (int) auto_increment - user1 (int) 10 - user2 (int) 10 1, 1, 10 -> users -> id 10 -> login Alex 2, 1, 9 -> users -> id 9 -> login James 3, 2, 1 -> users -> id 2 -> login Richard 4, 2, 9 5, 9, 10 нужно достать данные где присутствует мой id, по этому вытащить из users айдишник и логин, только противоположного пользователя. <a href="/?profile=10">Alex</a><br /> <a href="/?profile=9">James</a><br /> <a href="/?profile=2">Richard</a><br />
Во-первых, непонятно, у вас "дружба" - отношение реверсивное или нет? Т.е. если Алекс друг Фрэнка, то Френк друг Алекса или нет? Если нет - все просто, вот список всех друзей Фрэнка: select users.login from friends left join users on friends.user2=users.id where friends.user1 = 1
Вы предложили очень неоптимальный вариант - сначала вытащить все строки, где упоминается нужный user_id, а потом для каждой дергать базу еще раз. Ответьте на вопрос из моего прошлого поста. Я вот не понимаю, если user1 = 1 и user2 = 2, это означает то же самое, что user1=2 и user2=1? Кстати, поле friend_id в таблице не нужно. В любом случае там можно все сделать одним запросом, без цикла.
Тогда где-нибудь так: Код (Text): select distinct t.id, u.login from ( select user2 id from friends where user1=$id union all select user1 id from friends where user2=$id ) t left join users u on u.id=t.id
Вроди как все правельно работает, спасибо, можете еще расписать как этот запрос работает, я просто пока таких запросов не делал хотелось бы понять.
Внутренний запрос объединяет в себе два отдельных запроса: "выбрать всех пользователей, которые дружат с $id" и "выбрать всех пользователей, с которыми дружит $id". Получаем idшники всех друзей нужного человека (возможно, с повторами, я не знаю, как у вас организовано добавление друга). Потом к этой таблице прицепляем таблицу users и берем для каждого id соответствующее имя пользователя. Ну, и используем distinct, чтобы не получать повторы.
Чтобы понять, как работает join, надо один раз реализовать его руками. Взять выборку из двух таблиц и сделать декартово перемножение на том же пыхе, через циклы обычные. Придет понимание не только принципа работы join-а, но и то, почему их несколько видов.