Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Сложный запрос UNION c выборкой
Форумы портала PHP.SU » » Вопросы новичков » Сложный запрос UNION c выборкой

Страниц (1): [1]
 

1. in9emix - 11 Июня, 2012 - 07:28:41 - перейти к сообщению
Здравствуйте, помогите решить проблему пожалуйста.

У меня есть 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 друга
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);

Как вы видите с таким запросом работать не возможно...

С начала придется выводить одно, потом другое, а дальше так и запутаться можно. Я думаю так не правильно будет... А?! Конечно я готов ваши варианты выслушать. потому что я сюда обратился за помощью.
(Добавление)
Мелкий пишет:
Объедините таблицы в одну. (сам вопрос ещё не читал)

Жду помощи...
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

Что такое друзья друзей я не в курсе.

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 - подтвердил

в итоге выборка следующая, выбрать всех друзей
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT user1_id, user2_id FROM friends WHERE (status_1 == 2 AND user1_id = 'id нужного юзера') OR (status_2 == 2 AND user2_id = 'id нужного юзера')
6. in9emix - 11 Июня, 2012 - 10:24:18 - перейти к сообщению
Мелкий пишет:
as b join


Я могу AS на INNER заменить ? А то я не знаком с таким, первый раз вижу. Использую LEFT, RIGHT, INNER и UNION пока что.
7. Мелкий - 11 Июня, 2012 - 10:35:22 - перейти к сообщению
join без указания метода = inner join
as - алиас имени таблицы. Без алиасов просто не выйдет джойнить самого себя.
8. in9emix - 11 Июня, 2012 - 16:20:28 - перейти к сообщению
А?! Вопрос на счет JOIN, если так получилось что нужно вытащить мне нужные поля , а они оказались одинакового названия. Например a.name и b.name можно ли мне как то вытащить именно b.name ?
9. Мелкий - 11 Июня, 2012 - 19:16:23 - перейти к сообщению
Опят же алиасы. Присвойте полю алиасом другое имя и по нему обращайтесь.
10. in9emix - 12 Июня, 2012 - 03:42:05 - перейти к сообщению
Мелкий, где можно почитать руководство как это делать? В гугле совсем другое находит...
11. Alho - 12 Июня, 2012 - 05:07:39 - перейти к сообщению
Официальная документация.
Ну или русская документация:
http://www[dot]mysql[dot]ru/docs/man/SELECT[dot]html
и дальше по разделам. Много интересного узнаешь.
12. in9emix - 13 Июня, 2012 - 09:44:05 - перейти к сообщению
Благодарю, все получилось. Сделал то что хотел, спасибо ребят! Всем! Закатив глазки

 

Powered by ExBB FM 1.0 RC1