2013-10-13 9 views
0

Я начал разрабатывать чат-приложение для своего сайта.Сообщения GROUP BY MySQL

Сначала я сделал часть javascript, прежде чем я добрался до бэкэнда. И сейчас только что создали структуру базы данных:

CREATE TABLE IF NOT EXISTS `wp_bp_my_chat` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `from` varchar(255) NOT NULL DEFAULT '', 
    `to` varchar(255) NOT NULL DEFAULT '', 
    `message` text NOT NULL, 
    `sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `recd` int(10) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `to` (`to`), 
    KEY `from` (`from`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

Теперь, имея Databse, я хочу, чтобы сделать запрос, чтобы увидеть все сообщения, сгруппированных по «из» или «»

Думайте об этом как сообщения facebook , когда вы переходите на фактическую страницу, есть левая боковая панель с сообщениями, сгруппированными по разговора.

выход должен быть как:

  • разговор между "user_1" и "user_2" (непрочитанное) 2 часа назад

    разговор между "user_1" и "user_3" (непрочитанных) 3 часа назад

    converstation между "user_1" и "user_5" 5 часов назад

так м y сообщения сгруппированы, как разговоры. У меня могло бы быть сообщение с user_2, но оно должно быть отображено как одно (и информация от последнего)

Любые идеи, как я буду дальше? Как я еще не делал php-сторону. Вы даже можете предложить изменить базу данных для подключения к вашему решению.

Спасибо.

+0

Можете ли вы объяснить больше о том, как вы хотите, чтобы ваш результат выглядел? Функция GROUP BY SQL используется для получения сводной статистики (например, общего количества сообщений от конкретного отправителя), так что это не похоже на то, что вы хотите. – octern

+0

спасибо за внимание, я обновил свой вопрос – CBeTJlu4ok

+0

Вы ищете запрос, который вернет все сообщения в правильном порядке или тот, который просто вернет итоговую информацию, как вы показали в обновлении?Если это так, я ошибался, и вы все равно хотите использовать GROUP BY. – octern

ответ

2

Я предполагаю, что вы запустили это для одного человека ('user_1') для своих разговоров, что означает, что они могут быть либо из, либо из. Я также предполагаю, что это не имеет значения, если они есть или из, но группировать другим человеком в разговоре. Если да, попробуйте это. (Вы должны поместить некоторые образцы данных в SQLFiddle для тестирования)

SELECT MostRecent.MainPerson AS MainPerson 
    , MostRecent.OtherPerson AS OtherPerson 
    , MostRecent.Sent AS Sent 
    , IF(wp_bp_my_chat.recd = 0, 'Unread','Read') AS Status 
FROM wp_bp_my_chat 
JOIN (
    SELECT 'user_1' AS MainPerson 
     , IF(msgs.`from` = 'user_1',msgs.to, msgs.`from`) AS OtherPerson 
     , MAX(msgs.sent) AS sent 
    FROM wp_bp_my_chat AS msgs 
    WHERE msgs.`from` = 'user_1' OR msgs.`to` = 'users_1' 
    GROUP BY MainPerson, OtherPerson) AS MostRecent 
    ON (wp_bp_my_chat.`from` = MostRecent.MainPerson OR wp_bp_my_chat.`to` = MostRecent.MainPerson) 
    AND (wp_bp_my_chat.`from` = MostRecent.OtherPerson OR wp_bp_my_chat.`to` = MostRecent.OtherPerson) 
    AND MostRecent.sent = wp_bp_my_chat.sent 
ORDER BY sent DESC 
+0

Я думаю, что это должно сработать, поскольку вы разобрали мой зверский вопрос: D Да, это не имеет значения, если это «от» или «от», To ", я запустил это на человека и да, я хочу сгруппировать их с другим человеком. Я не могу проверить это сейчас, поскольку я не с этим компьютером сейчас, но сделаю это завтра, большое спасибо – CBeTJlu4ok

+0

Хорошо, сначала я пошел с другим ответом, но с большим количеством данных, я проверил, что он не работает так Я хотел, чтобы он работал. Я не выбрал этот, потому что он выдал ошибку о неявном поле. После большего исследования я изменил «IF (wp_bp_my_chat = 0,« Непрочитано »,« Чтение »)« на »IF (wp_bp_my_chat.recd = 0,« Непрочитано »,« Читать »)« И теперь это работает, я сделал делайте это правильно или это простая магия?) – CBeTJlu4ok

+0

@ Mpa4Hu - вы правы, это опечатка, которую я исправил выше – AgRizzo

-1

Это можно сделать с помощью простой группы по запросу:

SELECT * FROM `wp_bp_my_chat` WHERE `to` = {my_id} GROUP BY `from` 

Это даст вам все чаты, которые я как был пользователь.

+0

что, если бы я был этим, кто это задал? – CBeTJlu4ok

+0

-1 этот запрос не будет запущен. – Johan

+0

Я думаю, что лучше всего иметь отдельную таблицу, в которой хранятся все инициированные разговоры. Таким образом, вам нужно будет только запросить эту таблицу. И сохраните сообщения в другой таблице. Который будет связан с id – insanityCode

0

Чтобы получить результаты, которые вы описывали в своем обновлении, используйте:

SELECT count(*), max(sent) 
FROM wp_bp_my_chat 
WHERE to = 'name of recipient' 
GROUP BY from 

count(*) дает число сообщений и max(sent) дает время последнего сообщения, которые вы можете использовать, чтобы вычислить «часы назад "часть выпуска.

Я не вижу в вашей таблице флага для чтения сообщения. Вам нужно добавить это, чтобы добавить текст «(непрочитанный»).

+0

Что такое флаг? : D Я буду использовать логическое выражение, чтобы узнать, прочитано оно или нет. – CBeTJlu4ok

+0

anyways, what Если бы я был инициатором этого сообщения? – CBeTJlu4ok

+0

Вы используете Facebook? Если да, вы можете перейти на https://www.facebook.com/messages и увидеть левую боковую панель, вот о чем я говорю, за исключением того, что я не хочу отображать само сообщение, только такую ​​информацию, как read/unread timeago – CBeTJlu4ok