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 написал(а):
не работает
Спустя 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... - хотя бы несколько записей ).
На будущее. Если нужен совет по какому-либо вопросу, связанному с базами данных, предоставляйте структуру базы (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'ом
-- Структура таблицы `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 * |
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 вот это пишет. |
Исправил
Спустя 8 часов, 13 минут, 45 секунд (15.01.2012 - 21:05) ola_sh написал(а):
Цитата (killer8080 @ 15.01.2012 - 09:51) | ||
Исправил |
Не понял
Спустя 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 написал(а):
Спасибо, помогло
_____________
С Уважением ola_sh