2016-09-27 5 views
3

Я хочу заказать последние сообщения с каждым пользователем, который пользователь задал из таблицы архивов ejabberd.Получить самую новую запись из каждой группы

Поля, которые я использую в этих

  • идентификатор (идентификатор сообщения)
  • имя пользователя (имя пользователя копия)
  • bare_peer (пользователь, который общается с)
  • TXT (текстовый чат)
  • created_at (время создан)

Что я tryi ng для достижения чего-то подобного, но мне нужно сгруппировать сообщение bare_peer с именем пользователя 1_usernode, но только последние сообщения. Я уже тестировал много запросов, но никто из них не работал. Это первый запрос, который я пробовал.

SELECT id, username, bare_peer, txt FROM archive where 
username = '1_usernode' GROUP BY bare_peer ORDER BY created_at DESC; 

И это выход.

+------+------------+-------------------------------------------------------+---------------------+ 
| id | username | bare_peer    | txt       | created_at   | 
+------+------------+------------------------+------------------------------+---------------------+ 
| 1095 | 1_usernode | [email protected] | Hello !!!     | 2016-07-17 21:15:17 | 
| 1034 | 1_usernode | [email protected] | hey sup ?     | 2016-07-13 22:40:29 | 
| 1107 | 1_usernode | [email protected] | oi       | 2016-07-18 00:09:28 | 
| 1078 | 1_usernode | [email protected] | Hello this is just a Test!!! | 2016-07-15 16:30:50 | 
| 1101 | 1_usernode | [email protected] | hey       | 2016-07-18 00:05:55 | 
| 1084 | 1_usernode | [email protected] | Hey how are you?    | 2016-07-15 19:36:44 | 
| 1085 | 1_usernode | [email protected] | Hey how are you doing ?  | 2016-07-17 19:20:00 | 
+0

Является ли ваш столбец created_at в качестве типа данных datetime? –

+0

Поскольку все 'bare_peer' в вашем образце вывода уникальны, похоже, что он правильно выполнил ваш запрос. Вы имели в виду группу по имени пользователя? – Sablefoste

+0

Это поможет, если вы указали входные данные и ожидаемый результат. Может быть, создать скрипт sql – PaulF

ответ

0

Попробуйте этот запрос: -

SELECT archive.id, archive.max_id, archive.username, archive.bare_peer, archive.txt 
FROM archive join 
(SELECT MAX(id) max_id, username, bare_peer, txt 
FROM archivewhere username = '1_usernode' GROUP BY bare_peer) 
tab on archive.id=tab.max_id 
+1

Он возвращает мне самые старые сообщения, но спасибо в любом случае! – RenatoCv

+0

SELECT * FROM архив присоединиться (SELECT MAX (ID) max_id, имя пользователя, bare_peer, Txt из архива , где имя пользователя = '1_usernode' GROUP BY bare_peer) Вкладка на archive.id = tab.max_id попробовать этот запрос @RenatoCv –

+0

' SELECT * 'и' GROUP BY' в том же запросе недействительны SQL. – axiac

0

использовать этот запрос Это Helful.

SELECT MAX(id), username, bare_peer, txt FROM archive where 
username = '1_usernode' ORDER BY created_at DESC 
+0

Из-за неявной группировки (используется агрегатная функция, но предложение 'GROUP BY' присутствует), этот запрос возвращает одну строку, отображая' ORDER BY' бесполезно (запрос не возвращает ожидаемый результат, так или иначе). – axiac

+0

Для достижения этой цели должна быть работа. – RenatoCv

0

объявляют created_at, как DateTime

попробовать этот

DROP TABLE IF EXISTS `archive`; 

CREATE TABLE `archive` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `username` VARCHAR(50) DEFAULT NULL, 
    `bare_peer` VARCHAR(50) DEFAULT NULL, 
    `txt` TEXT, 
    `created_at` DATETIME DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB DEFAULT CHARSET=latin1; 

/* Данные для таблицы archive */

INSERT INTO `archive`(`id`,`username`,`bare_peer`,`txt`,`created_at`) 
VALUES (1034,'1_usernode','[email protected]','hey sup ?','2016-07-13 22:40:29'), 
(1078,'1_usernode','[email protected]','Hello this IS just a Test!!!','2016-07-15 16:30:50'), 
(1084,'1_usernode','[email protected]','Hey how are you?','2016-07-15 19:36:44'), 
(1085,'1_usernode','[email protected]','Hey how are you doing ?','2016-07-17 19:20:00'), 
(1095,'1_usernode','[email protected]','Hello !!!','2016-07-17 21:15:17'), 
(1101,'1_usernode','[email protected]','hey','2016-07-18 00:05:55'), 
(1107,'1_usernode','[email protected]','oi','2016-07-18 00:09:28'); 

Затем запустите ваш запрос

SELECT id, username, bare_peer, txt FROM archive where 
username = '1_usernode' GROUP BY bare_peer ORDER BY created_at DESC; 
+0

Если я просто изменю колонку, о которой идет речь, она должна работать в любом случае? – RenatoCv

+0

Я создал вторую таблицу под названием archive2 с вашими данными и добавил больше данных с более ранней датой. но он всегда возвращает мне самые старые сообщения. – RenatoCv

+0

Это работает. См. In fiddle http://sqlfiddle.com/#!9/45e67e/2 –

0

Попробуйте следующий код: -

select m.* 
from 
messages m 
inner join (
select max(id) as maxid 
from messages 
group By (if(username > bare_peer, username, bare_peer)), 
(if(username > bare_peer, bare_peer, username)) 
) t1 on m.id=t1.maxid ; 

м является псевдонимом таблицы сообщений

0

Вы хотите запись с максимальным (created_at) для каждого пользователя и bare_peer. Один из способов сделать это в MySQL - это «иметь», но мне это не нравится. я бы сначала получить максимальную (created_at) для каждой записи:

select username, bare_peer, max(created_at) as m_ 
from archive 
group by username, bare_peer; 

Затем соединить таблицу по этому результату:

select b.* 
from (
    select username, bare_peer, max(created_at) as m_ 
    from archive 
    group by username, bare_peer 
) a 
inner join archive as b on (
    a.username = b.username 
    and a.bare_peer = b.bare_peer 
    and a.m_ = b.created_at 
) 
0

Я хочу знать, почему он показывает колонку created_at, когда вы надеваете» t select created_at? И я не знаю, почему вы используете group by? Ничего не нужно разделить на группы.

Мое заявление выглядит следующим образом.select id, username, bare_peer, txt, created_at from archive where username = '1_usercode' order by created_at desc

+0

Я ошибочно удалил created_at из исходного запроса. – RenatoCv

0

Я создал временное решение с ответом Рахауто. Я поставил свой запрос, который возвращает мне правильный идентификатор из последнего сообщения внутри подзапроса , чтобы я мог извлечь содержимое сообщения из его идентификатора.

SELECT username, bare_peer, txt, created_at FROM archive WHERE id IN (
    SELECT tab.max_id FROM 
    archive JOIN (SELECT MAX(id) max_id, username, bare_peer, txt FROM 
    archive WHERE username = '1_usernode' GROUP BY bare_peer) 
    tab ON archive.id=tab.max_id 
); 
Смежные вопросы