[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод последних сообщений
ola_sh
reciver_id | sender_id | date | text
1 | 44 | 21.12.2011 | qwerty
1 | 2 | 23.12.2011 | qwerty
1 | 3 | 21.12.2011 | qwerty
1 | 2 | 15.12.2011 | qwerty
1 | 44 | 20.12.2011 | qwerty


Есть такая таблица сообщений, как мне составить запрос чтобы mysql вытаскивал только последнее сообщение от каждого пользователя которые отправляли сообщения.


Из этой таблицы должен получиться вот такой массив:
reciver_id | sender_id | date | text
1 | 44 | 21.12.2011 | qwerty
1 | 2 | 23.12.2011 | qwerty
1 | 3 | 21.12.2011 | qwerty




Спустя 20 часов, 35 минут, 36 секунд (13.01.2012 - 11:16) SlavaFr написал(а):
помоему гдето так:
select t1.* from tabliza  as t1 inner join
( select sender_id, max(`date`) as mdate from tabliza group by sender_id) as t2
on t1.sender_id=t2.sender_id and t1.`date` =mdate

Спустя 1 час, 10 минут, 37 секунд (13.01.2012 - 12:26) Placido написал(а):
Цитата (SlavaFr @ 13.01.2012 - 10:16)
помоему гдето так:
.. max(`date`) as mdate ... 

Если дата хранится не в формате DATE, а в каком-то строковом формате (а это, скореее всего так и есть), то MAX(date) будет работать некорректно (а вдруг там есть не только декабрь 2011 года?). В таком случае будет работать что-то вроде этого
SELECT 
`reciver_id`, `sender_id`, `date`, `text`
FROM
(SELECT
*, MAX(STR_TO_DATE(`date`, '%d.%m.%Y'))
FROM
`tbl`
GROUP BY `sender_id`) `t1`;

Из вопроса не ясно только, по какому полю нужно отсортировать результат.

Спустя 2 часа, 12 минут, 16 секунд (13.01.2012 - 14:38) SlavaFr написал(а):
Цитата (Placido @ 13.01.2012 - 09:26)
Если дата хранится не в формате DATE

Тогда пусть переделывает в правельный формат.

Спустя 1 день, 20 минут, 8 секунд (14.01.2012 - 14:59) ola_sh написал(а):
--
-- Структура таблицы `Message`
--

CREATE TABLE `Message` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`sender_id` int(255) unsigned NOT NULL,
`reciver_id` int(255) unsigned NOT NULL,
`datetime` date NOT NULL,
`status` smallint(6) NOT NULL DEFAULT '1',
`text` varchar(2000) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`),
KEY `sender_id` (`sender_id`,`reciver_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--


Были варианты по id который автоинкримент сортировать.

Спустя 8 минут, 57 секунд (14.01.2012 - 15:08) ola_sh написал(а):
SELECT * FROM (SELECT * FROM Message GROUP BY sender_id ) Message


Здесь вытаскивает праивльно, по одному сообщению, но только первые, а не последние, как вытащить последние?

Спустя 37 минут, 23 секунды (14.01.2012 - 15:45) Placido написал(а):
SELECT 
`id`, `sender_id`, `reciver_id`, `datetime`, `status`, `text`
FROM
(SELECT
*, MAX(`datetime`)
FROM
`Message`
GROUP BY `sender_id`) `t1`;

Спустя 39 минут, 29 секунд (14.01.2012 - 16:24) ola_sh написал(а):
не работает sad.gif

Спустя 25 минут, 37 секунд (14.01.2012 - 16:50) Placido написал(а):
Что не работает? Что выдает?

Спустя 1 час, 31 минута (14.01.2012 - 18:21) ola_sh написал(а):
Ограничивает по юзерам, но сообщения выдает ранние, а не последние

Спустя 5 часов, 20 минут, 52 секунды (14.01.2012 - 23:42) Placido написал(а):
Ничего не понял.
На будущее. Если нужен совет по какому-либо вопросу, связанному с базами данных, предоставляйте структуру базы (DDL) (CREATE ...) плюс дамп (INSERT... - хотя бы несколько записей ).

Спустя 31 минута, 27 секунд (15.01.2012 - 00:13) killer8080 написал(а):
SELECT * 
FROM (SELECT * FROM `Message` ORDER BY `datetime` DESC) AS `Message`
GROUP BY `sender_id`

Спустя 12 часов, 32 минуты, 1 секунда (15.01.2012 - 12:45) ola_sh написал(а):
--
-- Структура таблицы `Message`
--

CREATE TABLE `Message` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`sender_id` int(255) unsigned NOT NULL,
`reciver_id` int(255) unsigned NOT NULL,
`datetime` date NOT NULL,
`status` smallint(6) NOT NULL DEFAULT '1',
`text` varchar(2000) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`),
KEY `sender_id` (`sender_id`,`reciver_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Дамп данных таблицы `Message`
--

INSERT INTO `Message` VALUES(1, 1, 533, '2012-01-26', 1, '1');
INSERT INTO `Message` VALUES(2, 2, 533, '2012-01-01', 1, '2');
INSERT INTO `Message` VALUES(3, 2, 533, '2012-01-02', 1, '3');
INSERT INTO `Message` VALUES(4, 1, 533, '2012-01-31', 1, '4');

Сорри, просто не хотел усложнять все CREATE TABLE'ом

Спустя 2 минуты, 53 секунды (15.01.2012 - 12:48) ola_sh написал(а):
Цитата (killer8080 @ 14.01.2012 - 21:13)
SELECT * 
FROM (SELECT * FROM `Message` ORDER BY `datetime` DESC)
GROUP BY `sender_id`

Every derived table must have its own alias вот это пишет.

Спустя 2 минуты, 31 секунда (15.01.2012 - 12:51) killer8080 написал(а):
Цитата (ola_sh @ 15.01.2012 - 11:48)
Every derived table must have its own alias вот это пишет.

Исправил smile.gif

Спустя 8 часов, 13 минут, 45 секунд (15.01.2012 - 21:05) ola_sh написал(а):
Цитата (killer8080 @ 15.01.2012 - 09:51)
Цитата (ola_sh @ 15.01.2012 - 11:48)
Every derived table must have its own alias вот это пишет.

Исправил smile.gif

Не понял smile.gif

Спустя 5 минут, 6 секунд (15.01.2012 - 21:10) killer8080 написал(а):
Цитата (ola_sh @ 15.01.2012 - 20:05)
Не понял

Отредактировал пост с ошибкой.

SELECT * 
FROM (SELECT * FROM `Message` ORDER BY `datetime` DESC) AS `Message`
GROUP BY `sender_id`

Спустя 4 дня, 20 часов, 6 минут, 50 секунд (20.01.2012 - 17:16) ola_sh написал(а):
Спасибо, помогло smile.gif


_____________
С Уважением ola_sh
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.