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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сложный запрос UNION c выборкой

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Проблема с выводом информации
in9emix
Отправлено: 11 Июня, 2012 - 07:28:41
Post Id



Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




Здравствуйте, помогите решить проблему пожалуйста.

У меня есть 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 друга
 
 Top
Мелкий Супермодератор
Отправлено: 11 Июня, 2012 - 08:43:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Объедините таблицы в одну. (сам вопрос ещё не читал)


-----
PostgreSQL DBA
 
 Top
in9emix
Отправлено: 11 Июня, 2012 - 09:46:54
Post Id



Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




Можно конечно же и обойтись 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);

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

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

Жду помощи...
 
 Top
Мелкий Супермодератор
Отправлено: 11 Июня, 2012 - 10:14:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Таблица: кто (добавил в друзья), кого
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 моих друзей, идем дальше.

Почему во множественном числе? Вы получили первую строку результата.


-----
PostgreSQL DBA
 
 Top
Panoptik
Отправлено: 11 Июня, 2012 - 10:20:32
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




в любом случае используйте 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 нужного юзера')


-----
Just do it
 
 Top
in9emix
Отправлено: 11 Июня, 2012 - 10:24:18
Post Id



Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




Мелкий пишет:
as b join


Я могу AS на INNER заменить ? А то я не знаком с таким, первый раз вижу. Использую LEFT, RIGHT, INNER и UNION пока что.
 
 Top
Мелкий Супермодератор
Отправлено: 11 Июня, 2012 - 10:35:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




join без указания метода = inner join
as - алиас имени таблицы. Без алиасов просто не выйдет джойнить самого себя.


-----
PostgreSQL DBA
 
 Top
in9emix
Отправлено: 11 Июня, 2012 - 16:20:28
Post Id



Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




А?! Вопрос на счет JOIN, если так получилось что нужно вытащить мне нужные поля , а они оказались одинакового названия. Например a.name и b.name можно ли мне как то вытащить именно b.name ?
 
 Top
Мелкий Супермодератор
Отправлено: 11 Июня, 2012 - 19:16:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Опят же алиасы. Присвойте полю алиасом другое имя и по нему обращайтесь.


-----
PostgreSQL DBA
 
 Top
in9emix
Отправлено: 12 Июня, 2012 - 03:42:05
Post Id



Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




Мелкий, где можно почитать руководство как это делать? В гугле совсем другое находит...
 
 Top
Alho
Отправлено: 12 Июня, 2012 - 05:07:39
Post Id



Посетитель


Покинул форум
Сообщений всего: 322
Дата рег-ции: Апр. 2012  


Помог: 11 раз(а)




Официальная документация.
Ну или русская документация:
http://www[dot]mysql[dot]ru/docs/man/SELECT[dot]html
и дальше по разделам. Много интересного узнаешь.
 
 Top
in9emix
Отправлено: 13 Июня, 2012 - 09:44:05
Post Id



Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Март 2012  


Помог: 0 раз(а)




Благодарю, все получилось. Сделал то что хотел, спасибо ребят! Всем! Закатив глазки
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB