|
|
|
| Добрый день!
Есть таблица в которой хранятся сообщения пользователей
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 первого запроса и вообще можно ли обойтись одним запросом, дабы не загонять запрос в цикл? | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: cheops
(26.11.2011 в 12:45)
| | Уважаемый Хеопс, id = 1, допустим мой. А как быть с другими пользователями? их может быть сколько угодно. И каждый может писать письма
Суть такова, что данные должны быть представленны следующим образом:
Вася (Дата последнего сообщения переписки с Васей)
(Последнее сообщение переписки с Васей от меня ему или от него мне)
Петя (Дата последнего сообщения переписки с Петей)
(Последнее сообщение переписки с Петей от меня ему или от него мне)
Маша (Дата последнего сообщения переписки с Машей)
(Последнее сообщение переписки с Машей от меня ей или от нее мне)
Весь список должен сортироваться по дате общения с пользователем (Васей, Петей, Машей) | |
|
|
|
|
|
|
|
для: selma
(26.11.2011 в 18:15)
| | Т.е. вам просто нужно последние сообщение выбранного пользователя или ответ ему? Тогда еще проще
SELECT * FROM `table`
WHERE
komu=1 OR
kto=1
ORDER BY `times` DESC
LIMIT 1
|
| |
|
|
|
|
|
|
|
для: 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 (оно может быть как от меня ему, так и мне от него)
А еще же нужно выводить всех пользователей с которыми я переписывалась, Группировать их по имени, чтобы имена в списке не повторялись. А также чтобы весь список пользователей сортировался по свамому новому сообщению !мне! или от !меня!
З.Ы: В моем первом посте, вывод реализован, НО не сортирует пользователей по дате обращения ИХ ко мне. или МЕНЯ к ним
Ребята, тему не правильно назвали! ЭТО НЕ переписка между двумя людьми, а сгруппированный вывод всей переписки одного человека с другими | |
|
|
|
|
|
|
|
для: selma
(27.11.2011 в 03:43)
| | . | |
|
|
|
|
|
|
|
для: 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/>";
}
?>
|
Цель достигнута, но если поможете оптимизировать запросы, буду благодарна | |
|
|
|
|
|
|
|
для: selma
(27.11.2011 в 04:24)
| | разве таким способом будет выбрано сообщение если kto = 1, komu = n?
будет выбор сообщений только адресованных `komu`
интересная задачка кстати) мозг уже не варит, попробую решить её завтра ) | |
|
|
|
|
 11.8 Кб |
|
|
для: sl1p
(27.11.2011 в 06:15)
| | это и есть ОДНО НО! Если я написала кому нибудь, а до этого я с этим человеком не переписывалась. Мое исходящее не выведет:(((( Я совсем в замешательстве....
В аттаче, пример, как это организованно в соц.сети | |
|
|
|
|
|
|
|
для: 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");
?>
|
| |
|
|
|
|
|
|
|
для: Lotanaen
(29.11.2011 в 16:51)
| | Снимаю шляпу ! | |
|
|
|
|
|
|
|
для: selma
(26.11.2011 в 09:59)
| | ~ | |
|
|
|