Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Как вывести данный из двух таблиц одним циклом?

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

MrLego

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приведу пример, который вам точно объяснит что же я хочу:
 
Практически все сидят Вконтакте и все видели, как там устроены сообщения, а собственно страница, где показывает все входящие, ну или отправленные сообщения.
Я хочу, что бы на моем сайте выводило так же сообщения, но с учетом того, что я использую две таблицы в Базе Данных.
Есть таблица users и есть таблица mail, когда я вывожу циклом все входящие сообщения(из таблицы mail), то хотел бы видеть видеть аватарку пользователя рядом с каждым сообщением (и именно автора сообщения), но аватарка лежит в таблице users. И вот как достать ее с той таблицы (users) и прикрепить именно к тому сообщению, которой пришло от того пользователя?
Так же хотелось бы сделать и с именем пользователя, которое лежит в таблице users.
Таблица mail очень простая, там есть поля для id отправителя и получателя ну и поле с сообщением и датой отправки.
Ну так вот, у нас есть в таблице mail айди пользователя, который отправил сообщение и как с помощью этого id вывести рядом с сообщением аватарку, которая лежит в users (поле avatar) и не нарушить цикл...

Всего записей: 7 | Зарегистр. 22-06-2010 | Отправлено: 02:05 22-06-2010
poyt



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть много-табличные запросы.
Когда производится выборка из нескольких таблиц одновременно.
Также это будет более оптимальным вариантом, чем вывод в цикле.
 
Пример:
Таблица 1 (пользователи):
table_1
поля:
id | name | data | avatar
 
Таблица 2 (сообщения):
table_2
поля:
id | mess | userid
 
Пример 2-х табличного запроса:

Код:
SELECT table_1.id, table_1.name, table_1.avatar, table_2.id, table_2.mess FROM table_1, table_2 WHERE table_1.id = table_2.userid;

 
Таким образом в результате запроса вы получаете массив идентификатора пользователя (table_1.id), его имя (table_1.name), ссылку на аватар (table_1.avatar), номер сообщения (table_2.id) и само сообщение (table_2.mess).
 
Для более детального понимания вопроса рекомендую по этой теме поискать на форуме: многотабличные запросы, 1-ая, 2-ая, 3-ая и другие нормальные формы таблиц баз данных.
Эта информация поможет при проектировании и оптимизации как работающего кода, так и баз данных, что в свою очередь будет влиять на время работы скрипта на сервере.

Всего записей: 642 | Зарегистр. 26-06-2006 | Отправлено: 03:59 22-06-2010
MrLego

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо!  
Я долго голову ломал с этим выводом из двух таблиц )
Еще раз спс )

Всего записей: 7 | Зарегистр. 22-06-2010 | Отправлено: 11:24 22-06-2010
MrLego

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возник еще вопрос, а как правильно сортировать вывод из базы??  
У меня раньше было так  
 
SELECT * FROM mail WHERE addressee='$dliamenia' AND activation='1' ORDER BY identificator DESC LIMIT $start, $num  
 
А теперь по идее должно быть так:
 
SELECT mail.identificator, mail.sender, mail.data, mail.activation, mail.addressee, mail.time, mail.description, users.avatar, users.name, users.family, users.user_numder FROM mail, users WHERE mail.addressee='$dliamenia' AND mail.activation='1' mail.sender = users.user_numder  ORDER BY mail.identificator DESC LIMIT $start, $num  
 
Но ничего не выводит... Короче вот тут WHERE mail.addressee='$dliamenia' AND mail.activation='1'  что то не правильно или я где то не так всунул что то....
помогите ))

Всего записей: 7 | Зарегистр. 22-06-2010 | Отправлено: 17:47 22-06-2010
poyt



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
SELECT mail.identificator, mail.sender, mail.data, mail.activation, mail.addressee, mail.time, mail.description, users.avatar, users.name, users.family, users.user_numder FROM mail, users WHERE mail.addressee='$dliamenia' AND mail.activation='1' AND mail.sender = users.user_numder  ORDER BY mail.identificator DESC LIMIT $start, $num

 
выделил ещё один AND, он у вас был?

Всего записей: 642 | Зарегистр. 26-06-2006 | Отправлено: 18:39 22-06-2010 | Исправлено: poyt, 18:40 22-06-2010
MrLego

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
нет, так как раньше не было mail.addressee='$dliamenia'  

Всего записей: 7 | Зарегистр. 22-06-2010 | Отправлено: 19:01 22-06-2010
poyt



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я скопировал тот запрос, который вы привели, и увидел, что там нет AND
обычно MySQL ругается на то место, где пропускаются связки, тут AND является такой связкой для объединения условий
 
тот запрос, который я привёл с AND, он у вас работает?

Всего записей: 642 | Зарегистр. 26-06-2006 | Отправлено: 19:04 22-06-2010
MrLego

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет, он вообще ничего не выводит(

Всего записей: 7 | Зарегистр. 22-06-2010 | Отправлено: 20:10 22-06-2010
poyt



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
как точно выглядит тот запрос, который используете в скрипте?
как выглядит структура таблиц?

Всего записей: 642 | Зарегистр. 26-06-2006 | Отправлено: 20:17 22-06-2010
MrLego

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну сейчас я обошолся без activation='1'  и выглядит он так:  
 
$result14 = mysql_query("SELECT mail.identificator, mail.sender, mail.data, mail.activation, mail.addressee, mail.time, mail.description, users.avatar, users.name, users.family, users.user_numder FROM mail, users WHERE mail.sender = users.user_numder AND addressee='$dliamenia' ORDER BY mail.identificator DESC LIMIT $start, $num ");
while ($myrow14 = mysql_fetch_array ($result14)) {
 
 
 printf ("<table id='msg'><tr>
<td valign='center' width='60' align='center'><a href='view_user.php?user_numder=%s'><img border='0' src='%s' width='60'></a></td>
<td valign='center' width='120' align='left'><div class='msg_name'>%s %s</div><div class='msg_data'>%s %s</div></td>
<td valign='top' ><a href='view_messege.php?identificator=%s'>%s </a></td>
</tr></table>",$myrow14["user_numder"],$myrow14["avatar"],$myrow14["name"],$myrow14["family"],$myrow14["data"],$myrow14["time"],$myrow14["identificator"],$myrow14["description"]);
}

Всего записей: 7 | Зарегистр. 22-06-2010 | Отправлено: 20:48 22-06-2010
poyt



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
$result14 = mysql_query("SELECT mail.identificator, mail.sender, mail.data, mail.activation, mail.addressee, mail.time, mail.description, users.avatar, users.name, users.family, users.user_numder FROM mail, users WHERE mail.sender = users.user_numder AND mail.addressee='$dliamenia' ORDER BY mail.identificator DESC LIMIT $start, $num ");
while ($myrow14 = mysql_fetch_array ($result14)) {  

 
Выделил недостающий момент в запросе.
 

Цитата:
printf ("<table id='msg'><tr>
<td valign='center' width='60' align='center'><a href='view_user.php?user_numder=%s'><img border='0' src='%s' width='60'></a></td>
<td valign='center' width='120' align='left'><div class='msg_name'>%s %s</div><div class='msg_data'>%s %s</div></td>
<td valign='top' ><a href='view_messege.php?identificator=%s'>%s </a></td>
</tr></table>",$myrow14["user_numder"],$myrow14["avatar"],$myrow14["name"],$myrow14["family"],$myrow14["data"],$myrow14["time"],$myrow14["identificator"],$myrow14["description"]);
}  

 
Лучше обратиться к нужным полям по числовым индексам начиная с 0.
 

Код:
mail.identificator, mail.sender, mail.data, mail.activation, mail.addressee, mail.time, mail.description, users.avatar, users.name, users.family, users.user_numder

 
Соответственно чтобы их получить обращаетесь к ним в таком же порядке:
 

Код:
$myrow14[0], $myrow14[1], ..., $myrow14[10],

 
В много-табличных запросах запросы по названию столбцов не работают.
Нашёл информацию по этим обращениям здесь.

Всего записей: 642 | Зарегистр. 26-06-2006 | Отправлено: 21:05 22-06-2010 | Исправлено: poyt, 21:08 22-06-2010
MrLego

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо за помощь, все огонь теперь )  
Буду должен ))

Всего записей: 7 | Зарегистр. 22-06-2010 | Отправлено: 22:31 22-06-2010
Mamay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
я бы делал запрос с лефт джойном
 
SELECT `m`.`identificator`, `m`.`sender`, `m`.`data`, `m`.`activation`, `m`.`addressee`, `m`.`time`, `m`.`description`, `u`.`avatar`, `u`.`name`, `u`.`family`, `u`.`user_numder` FROM `mail` AS `m` LEFT JOIN `users` AS `u` ON `u`.`user_numder` = `m`.`sender` WHERE `m`.`addressee`='$dliamenia' ORDER BY `m`.`identificator` DESC LIMIT $start, $num


----------
Даже самый дурацкий замысел можно выполнить мастерски

Всего записей: 1352 | Зарегистр. 03-09-2002 | Отправлено: 14:42 23-06-2010
imwerden

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А как ко всему к этому еще прикрутить count? Чтобы выходил список юзеров и количество mess?
Я нашел много ответов в интернете, но у меня все это не работает, поскольку в ответах нет полной записи кода на вывод полученного результата....

Всего записей: 14 | Зарегистр. 06-06-2014 | Отправлено: 14:57 06-06-2014
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Как вывести данный из двух таблиц одним циклом?


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru