Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Снова JOIN?
 
 автор: Deed   (15.02.2015 в 20:42)   письмо автору
 
 

Доброго времени суток!
<?php
Table clients
:
----------------------------
 
id name link pict |
-----------------------------

Table messages:
--------------------------------
 
id from_id to_id text |
--------------------------------
где "from_id" id автора сообщения,
"to_id" id получателя сообщения.
?>

Нужно вывести все сообщения пользователя, адресованные ему и написанные им:
<?php
$your_messages
=mysql_query("SELECT * FROM `messages` WHERE `from_id`='$your_id' OR `to_id`='$your_id'");
//...
?>

но так, чтобы с text из таблицы "messages" "подхватывать" из таблицы "clients" name, link & pict авторов сообщений.

Благодарю заранее!

  Ответить  
 
 автор: Sfinks   (15.02.2015 в 21:28)   письмо автору
 
   для: Deed   (15.02.2015 в 20:42)
 

-- <?

  SELECT
    c
.*,
    
m.id,
    
m.text,
    
'your_message' AS `direction`
  
FROM messages AS m
  JOIN clients 
AS c
  ON m
.to_id c.id
  WHERE m
.from_id 111
UNION ALL
  SELECT
    c
.*,
    
m.id,
    
m.text,
    
'message_to_you' AS `direction`
  
FROM messages AS m
  JOIN clients 
AS c
  ON m
.from_id c.id
  WHERE m
.to_id 111

  Ответить  
 
 автор: Deed   (15.02.2015 в 21:47)   письмо автору
 
   для: Sfinks   (15.02.2015 в 21:28)
 

Спасибо большое!
Но как разобрать это в цикле?
И что такое AS `direction` ?

Еще более огромное спасибо!

P.S. Начинаю "врубляться"... Но как вывести два изображения - автора сообщения и получателя??

  Ответить  
 
 автор: Sfinks   (15.02.2015 в 22:58)   письмо автору
 
   для: Deed   (15.02.2015 в 21:47)
 

Ну вы же запрашиваете это для какого-то конкретного юзера.
В моем примере с id = 111
Значит его данные, в том числе и фото, можно получить предварительно. Верно?
Допустим мы загрузили их в $user.
А далее в цикле перебираем результат запроса.
Вот тут-то нам и понадобится дополнительное поле direction, которое показывает направление письма.
Т.е. если direction == 'your_message', то наш $user - это отправитель. Его данные и фото мы выводим из $user, а получатель у нас в запросе.
А если direction == 'message_to_you', то отправитель в результате запроса, а получатель - наш $user.

Естессно вместо direction можно любой другой идентификатор. Можно вообще флаг is_incoming со значениями 0 и 1. Тут как вам проще ориентироваться.

  Ответить  
 
 автор: Deed   (15.02.2015 в 23:10)   письмо автору
 
   для: Sfinks   (15.02.2015 в 22:58)
 

Мммм... Да, Вы хорошо объяснили. Моя Вам благодарность!
Но каприз в том, что нужен такой вывод:

[фото (юзер или адресат)] -> [фото (адресат или юзер)] дата коммента
ТЕКСТ...

То есть, нужны данные и отправителя и получателя каждого сообщения, как ни прискорбно.

  Ответить  
 
 автор: Sfinks   (15.02.2015 в 23:27)   письмо автору
 
   для: Deed   (15.02.2015 в 23:10)
 

И в чем проблема?
<?php

$user 
загружаем
$res  
делаем запрос к БД

while($row mysqli_fetch_assoc($res)){
  if(
$row['direction'] == 'your_message'){
    
$sender_photo $user['pict'];
    
$sender_name  $user['name'];
    
$getter_photo $row['pict'];
    
$getter_name  $row['name'];
  }
  else{
    
$sender_photo $row['pict'];
    
$sender_name  $row['name'];
    
$getter_photo $user['pict'];
    
$getter_name  $user['name'];
  }
  echo 
"Отправитель: <img src='$sender_photo' /> $sender_name<br>";
  echo 
"Получатель: <img src='$getter_photo' /> $getter_name<br>";
  echo 
'Дата: ' $row['date']; // ее кстати надо еще добавить в запрос. В ващих показанных таблицах ее не было
  
echo 'Сообщение: ' $row['text'];
}

  Ответить  
 
 автор: Deed   (15.02.2015 в 23:52)   письмо автору
 
   для: Sfinks   (15.02.2015 в 23:27)
 

Ну, не знаю, как благодарить!
Спасибо Вам!
Там сложная таблица, и я привел очень-очень упрощенный пример, чтобы понять сам принцип составления запроса.
Благодаря Вам, проблема уже близка к разрешению.
Я попробую остальное "додумать" сам - так знания лучше закрепляются.
Спасибо!!

  Ответить  
 
 автор: Sfinks   (16.02.2015 в 00:10)   письмо автору
 
   для: Deed   (15.02.2015 в 23:52)
 

Когда у человека такой подход, то и помочь приятно! )

  Ответить  
 
 автор: Deed   (16.02.2015 в 15:34)   письмо автору
 
   для: Sfinks   (16.02.2015 в 00:10)
 

Спасибо за помощь и добрые слова.
Однако, неразрешимая (для меня) ситуация.

//Table messages:
---------------------------------------------
 id | thred | from_id | to_id | text |
--------------------------------------------- 
 1  |   1  |   23    |  54  | tttt  |
---------------------------------------------
 2  |   1  |   54    |  23  | ffff  |
---------------------------------------------
 3  |   3  |   74    |  10  | yyy |
---------------------------------------------
 4  |   1  |   23    |  54  | rrrr |
---------------------------------------------
...


В таблице есть столбец "трэд", общий для всех реплик одного диалога.
Подскажите, пожалуйста, как прописать ORDER BY, чтобы шла сортировка реплик по id внутри каждого треда.

-- <?

 
SELECT
    c
.*,
    
m.id,
   
m.thred,
    
m.text,
    
'your_message' AS `direction`
    
FROM messages AS m
    JOIN clients 
AS c
    ON m
.to_id c.id
    WHERE m
.from_id 111
    ORDER BY m
.id)
UNION ALL
  
(SELECT
    c
.*,
    
m.id,
    
m.thred,
    
m.text,
    
'message_to_you' AS `direction`
    
FROM messages AS m
    JOIN clients 
AS c
    ON m
.from_id c.id
    WHERE m
.to_id 111
    ORDER BY m
.id)
 
ORDER BY m.thred



Сортировка по тредам происходит, а вот по id внутри треда выводится вразнобой.

Кажись, решено:

-- <?

 
SELECT
    c
.*,
    
m.id,
   
m.thred,
    
m.text,
    
'your_message' AS `direction`
    
FROM messages AS m
    JOIN clients 
AS c
    ON m
.to_id c.id
    WHERE m
.from_id 111
    ORDER BY m
.id)
UNION ALL
  
(SELECT
    c
.*,
    
m.id,
    
m.thred,
    
m.text,
    
'message_to_you' AS `direction`
    
FROM messages AS m
    JOIN clients 
AS c
    ON m
.from_id c.id
    WHERE m
.to_id 111
    ORDER BY m
.id)
 
ORDER BY m.thredm.id



Множественный ORDER BY: http://stackoverflow.com/questions/7015839/left-outer-join-with-conditions-where-order-by

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования