Здравствуйте, помогите решить проблему пожалуйста.
У меня есть 2 таблицы (friends1 и friends2).
В friends1 попадает информация таким образом:
user1 предложил дружбу user2
В friends2 :
user2 подтвердил что user1 его друг
Исходя из этого я решил сделать запрос на вывод всех моих друзей из friends1 и friends2 а именно вытащить друзей которым я предложил дружбы и которые мне предложили (соответственно мы стали друзьями). И так вот запрос:
$result3 = mysql_query("(SELECT my_friend_id FROM friends1 WHERE i_id = $id) UNION (SELECT my_friend_id FROM friends2 WHERE i_id = $id)",$db);
$myrow3 = mysql_fetch_array($result3);
$id - это моя сессия
Тут все хорошо, я получаю в массив myrow3 [my_friend_id ] id моих друзей, идем дальше.
Есть такое понятие "Друзья друзей". Именно это я и хочу дальше добиться. Рас мы получили id моих друзей (которые мне предлагали дружбу и которым предлагал я) то я сделал след. запрос:
$result4 = mysql_query("(SELECT * FROM friends WHERE i_id = $myrow3[my_friend_id]) UNION (SELECT * FROM friends2 WHERE i_id = $myrow3[my_friend_id])",$db);
$myrow4 = mysql_fetch_array($result4);
Через do while вывожу информацию:
do {
echo "Ваш друг ".$myrow4['i_id']." подружился с ".$myrow4['my_friend_id']."<br>";
}
while ($myrow4 = mysql_fetch_array($result4));
В friends1 попадают юзеры с которыми я подружился (а именно только те кому я кинул дружбы).
В friends2 попадают юзеры с которыми я подружился (а именно только те которые подтвердили что я их друг).
И тут сложность:
У меня выводиться только 1 юзер и всё. Конечно я много еще вариантов пробовал и у меня даже получалось так: Вот предложил если я 10 юзерам дружбу (те подтвердили) и они выводятся. А как только хоть 1 юзер предложит мне дружбу и начнет добавлять в друзья. То все эти 10 юзеров которые вывелись ранее просто исчезают и начинают появляться другие, а именно те, которым с которыми подружился юзер который мне кинул дружбу ранее.
Вот такая проблема( ...
Вы спросите почему я тогда разделил друзей на таблицы friends1 и friends2 , потому что так легче обращаться к бд. Легче подставлять значения... особенно в первом запросе... где нам нужно всего лишь вытащить id друга
1. in9emix - 11 Июня, 2012 - 07:28:41 - перейти к сообщению
2. Мелкий - 11 Июня, 2012 - 08:43:40 - перейти к сообщению
Объедините таблицы в одну. (сам вопрос ещё не читал)
3. in9emix - 11 Июня, 2012 - 09:46:54 - перейти к сообщению
Можно конечно же и обойтись 2ой таблице, сделать запрос к одной...к самой первой friends1...Но это опять же ничего не меняет...
(Добавление)
Если делать как вы предложили...или как я понял, запрос будет выглядеть след. образом:
$result3 = mysql_query("(SELECT my_friend_id FROM friends WHERE i_id = $id) UNION (SELECT i_id FROM friends WHERE my_friend_id = $id)",$db);
$myrow3 = mysql_fetch_array($result3);
Как вы видите с таким запросом работать не возможно...
С начала придется выводить одно, потом другое, а дальше так и запутаться можно. Я думаю так не правильно будет... Конечно я готов ваши варианты выслушать. потому что я сюда обратился за помощью.
(Добавление)
Жду помощи...
(Добавление)
Если делать как вы предложили...или как я понял, запрос будет выглядеть след. образом:
$result3 = mysql_query("(SELECT my_friend_id FROM friends WHERE i_id = $id) UNION (SELECT i_id FROM friends WHERE my_friend_id = $id)",$db);
$myrow3 = mysql_fetch_array($result3);
Как вы видите с таким запросом работать не возможно...
С начала придется выводить одно, потом другое, а дальше так и запутаться можно. Я думаю так не правильно будет... Конечно я готов ваши варианты выслушать. потому что я сюда обратился за помощью.
(Добавление)
Мелкий пишет:
Объедините таблицы в одну. (сам вопрос ещё не читал)
Жду помощи...
4. Мелкий - 11 Июня, 2012 - 10:14:44 - перейти к сообщению
Таблица: кто (добавил в друзья), кого
PK на первые 2 поля, уникальный индекс по кого-кто.
Вывод всех, кому предложили дружбу: where кто=$id
Кто предложил нам: where кому=$id
И те и те - объедините 2 условия по or, union здесь нафиг не нужен
Добавлен и он к вам и вы к нему: select b.кому from friends as b join friends as a on a.кому=$id and a.кто = b.кому where b.кто=$id
Что такое друзья друзей я не в курсе.
Почему во множественном числе? Вы получили первую строку результата.
PK на первые 2 поля, уникальный индекс по кого-кто.
Вывод всех, кому предложили дружбу: where кто=$id
Кто предложил нам: where кому=$id
И те и те - объедините 2 условия по or, union здесь нафиг не нужен
Добавлен и он к вам и вы к нему: select b.кому from friends as b join friends as a on a.кому=$id and a.кто = b.кому where b.кто=$id
Что такое друзья друзей я не в курсе.
in9emix пишет:
Тут все хорошо, я получаю в массив myrow3 [my_friend_id ] id моих друзей, идем дальше.
Почему во множественном числе? Вы получили первую строку результата.
5. Panoptik - 11 Июня, 2012 - 10:20:32 - перейти к сообщению
в любом случае используйте 1 таблицу. во-первых юнионы тормозят выборку, во-вторых вы сами поняли что ваш вариант не помогает вам делать "сложные" выборки
создайте примерно такую таблицу:
friends
user1_id user2_id status_1 status_2 дополнительные поля
в таблице установите индексы по соответствующим полям и выборка будет в разы быстрее
теперь по логике хранения данных
с полями юзер понятно - это id: 1- инициатор, 2 - тот кто должен ответить
статусы соответственно например у инициатора:
1 - подал запрос на дружбу
2 - в друзьях
у отвечающего:
1 - не подтвердил дружбу
2 - подтвердил
в итоге выборка следующая, выбрать всех друзей
создайте примерно такую таблицу:
friends
user1_id user2_id status_1 status_2 дополнительные поля
в таблице установите индексы по соответствующим полям и выборка будет в разы быстрее
теперь по логике хранения данных
с полями юзер понятно - это id: 1- инициатор, 2 - тот кто должен ответить
статусы соответственно например у инициатора:
1 - подал запрос на дружбу
2 - в друзьях
у отвечающего:
1 - не подтвердил дружбу
2 - подтвердил
в итоге выборка следующая, выбрать всех друзей
CODE (SQL):
скопировать код в буфер обмена
скопировать код в буфер обмена
- SELECT user1_id, user2_id FROM friends WHERE (status_1 == 2 AND user1_id = 'id нужного юзера') OR (status_2 == 2 AND user2_id = 'id нужного юзера')