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

Форум MySQL

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

 

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

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

тема: Выборка последнего сообщения в переписки между двумя людьми
 
 автор: selma   (26.11.2011 в 09:59)   письмо автору
 
 

Добрый день!

Есть таблица в которой хранятся сообщения пользователей


CREATE TABLE IF NOT EXISTS `table` (
  `id` int(9) NOT NULL auto_increment,
  `kto` int(9) NOT NULL,
  `komu` int(9) NOT NULL,
  `mess` text NOT NULL,
  `times` varchar(10) NOT NULL,
  `new` int(1) NOT NULL default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;


и дамп


INSERT INTO `table` (`id`, `kto`, `komu`, `mess`, `times`, `new`) VALUES
(1, 2, 1, 'мес1', '1321222980', 1),
(2, 2, 1, 'мес2', '1321222982', 1),
(3, 1, 2, 'мес3', '1321222995', 1),
(4, 3, 1, 'месс4', '1321223000', 1),
(5, 1, 2, 'месс5', '1321223100', 1),
(6, 2, 1, 'месс6', '1321223110', 1);


Необходимо выводить данные в таком виде:

Кто написал мне время последнего сообщения
тут последнее сообщение переписки между мной и другим пользователем (мое или его в завсисимости чье позже написано)



Делала так:
<?
$q_mess 
mysql_query("SELECT * FROM `table`  WHERE  `komu`='1' GROUP BY `kto` ORDER BY `times` DESC");
while(
$arr mysql_fetch_assoc($q_mess))
  {
  
$arr_m mysql_fetch_assoc(mysql_query("SELECT * FROM `table` WHERE `kto`='".$arr['kto']."' OR `komu`='".$arr['kto']."' ORDER BY `times` DESC LIMIT 1"));
  
  echo 
$arr['kto']." ".date("d.m.y H:i:s"$arr['times'])."<br/>";
  echo  
htmlspecialchars($arr_m['mess'])."<br/>";
  }
?>


Немного не так...
Выводит игнорируя ORDER BY первого запроса и вообще можно ли обойтись одним запросом, дабы не загонять запрос в цикл?

  Ответить  
 
 автор: cheops   (26.11.2011 в 12:45)   письмо автору
 
   для: selma   (26.11.2011 в 09:59)
 

Можно воспользоваться следующим запросом
SELECT * FROM `table`
WHERE
  (komu=1 AND
  kto=2) OR
  (komu=2 AND
  kto=1)
ORDER BY `times` DESC
LIMIT 1

  Ответить  
 
 автор: selma   (26.11.2011 в 18:15)   письмо автору
 
   для: cheops   (26.11.2011 в 12:45)
 

Уважаемый Хеопс, id = 1, допустим мой. А как быть с другими пользователями? их может быть сколько угодно. И каждый может писать письма

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

Вася (Дата последнего сообщения переписки с Васей)
(Последнее сообщение переписки с Васей от меня ему или от него мне)

Петя (Дата последнего сообщения переписки с Петей)
(Последнее сообщение переписки с Петей от меня ему или от него мне)

Маша (Дата последнего сообщения переписки с Машей)
(Последнее сообщение переписки с Машей от меня ей или от нее мне)

Весь список должен сортироваться по дате общения с пользователем (Васей, Петей, Машей)

  Ответить  
 
 автор: cheops   (26.11.2011 в 21:05)   письмо автору
 
   для: selma   (26.11.2011 в 18:15)
 

Т.е. вам просто нужно последние сообщение выбранного пользователя или ответ ему? Тогда еще проще
SELECT * FROM `table` 
WHERE 
  komu=1 OR 
  kto=1
ORDER BY `times` DESC 
LIMIT 1

  Ответить  
 
 автор: selma   (27.11.2011 в 03:43)   письмо автору
 
   для: cheops   (26.11.2011 в 21:05)
 

Это мой второй запрос, у меня он реализован в цикле первого запроса

Уже не знаю как и объяснить... нарисовать что ли:)

Вот Я захожу в раздел сообщения

Выводится весь список пользователей с которыми я переписывалась

Выводится так:

Пользователь 1 (id=2) [дата последнего сообщения переписки с пользователем 1]
--Последние сообщение переписки с пользователем 1  (оно может быть как от меня ему, так и мне от него)

РАЗДЕЛИТЕЛЬ

Пользователь 2 (id=3) [дата последнего сообщения переписки с пользователем 2]
--Последние сообщение переписки с пользователем 2 (оно может быть как от меня ему, так и мне от него)

РАЗДЕЛИТЕЛЬ
и т.д

Так вот:
SELECT * FROM `table`  
WHERE  
  komu=ID ИЗ СПИСКА ПОЛЗОВАТЕЛЕЙ  OR  
  kto=ID ИЗ СПИСКА ПОЛЗОВАТЕЛЕЙ 
ORDER BY `times` DESC  
LIMIT 1

Выводит: --Последние сообщение переписки с пользователем N (оно может быть как от меня ему, так и мне от него)

А еще же нужно выводить всех пользователей с которыми я переписывалась, Группировать их по имени, чтобы имена в списке не повторялись. А также чтобы весь список пользователей сортировался по свамому новому сообщению !мне! или от !меня!

З.Ы: В моем первом посте, вывод реализован, НО не сортирует пользователей по дате обращения ИХ ко мне. или МЕНЯ к ним

Ребята, тему не правильно назвали! ЭТО НЕ переписка между двумя людьми, а сгруппированный вывод всей переписки одного человека с другими

  Ответить  
 
 автор: sl1p   (27.11.2011 в 04:19)   письмо автору
 
   для: selma   (27.11.2011 в 03:43)
 

.

  Ответить  
 
 автор: selma   (27.11.2011 в 04:24)   письмо автору
 
   для: sl1p   (27.11.2011 в 04:19)
 

Нашла решение таким способом:


<? 
$q_mess 
mysql_query("SELECT * FROM (SELECT * FROM `table` ORDER BY `times` DESC) 
                                                AS table2 
                                                WHERE `komu`='1' 
                                                GROUP BY `kto` 
                                                ORDER BY `times` DESC"
); 
while(
$arr mysql_fetch_assoc($q_mess)) 
  { 
  
$arr_m mysql_fetch_assoc(mysql_query("SELECT * FROM `table` WHERE `kto`='".$arr['kto']."' OR `komu`='".$arr['kto']."' ORDER BY `times` DESC LIMIT 1")); 
   
  echo 
$arr['kto']." ".date("d.m.y H:i:s"$arr_m['times'])."<br/>"
  echo  
htmlspecialchars($arr_m['mess'])."<br/>"
  } 
?>

Цель достигнута, но если поможете оптимизировать запросы, буду благодарна

  Ответить  
 
 автор: sl1p   (27.11.2011 в 06:15)   письмо автору
 
   для: selma   (27.11.2011 в 04:24)
 

разве таким способом будет выбрано сообщение если kto = 1, komu = n?
будет выбор сообщений только адресованных `komu`
интересная задачка кстати) мозг уже не варит, попробую решить её завтра )

  Ответить  
 
 автор: selma   (27.11.2011 в 08:03)   письмо автору
11.8 Кб
 
   для: sl1p   (27.11.2011 в 06:15)
 

это и есть ОДНО НО! Если я написала кому нибудь, а до этого я с этим человеком не переписывалась. Мое исходящее не выведет:(((( Я совсем в замешательстве....

В аттаче, пример, как это организованно в соц.сети

  Ответить  
 
 автор: Lotanaen   (29.11.2011 в 16:51)   письмо автору
 
   для: selma   (27.11.2011 в 04:24)
 

Попробуйте таким образом:

<? 
$q_mess 
mysql_query("SELECT * , IF(`komu`='1',`kto`,`komu`) as parname FROM (SELECT * FROM `table` ORDER BY `times` DESC) 
                                                AS table2 
                                                WHERE (`komu`='1' or `kto`='1')
                                                GROUP BY parname 
                                                ORDER BY `times` DESC"
); 

?> 

  Ответить  
 
 автор: KPETuH   (29.11.2011 в 20:51)   письмо автору
 
   для: Lotanaen   (29.11.2011 в 16:51)
 

Снимаю шляпу !

  Ответить  
 
 автор: KPETuH   (29.11.2011 в 15:34)   письмо автору
 
   для: selma   (26.11.2011 в 09:59)
 

~

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

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