2014-01-15 3 views
0

У меня есть следующая структура таблицы для таблицы notifications.Группировка уведомлений по типу MySql

id user_id post_id type status date  seconduser_id 
1 1  23  1  0  somedate 4 
2 2  25  2  0  somedate 3 
3 3  26  1  0  somedate 4 
4 4  28  2  1  somedate 5 
5 5  21  2  0  somedate 4 
--- 
--- 
and so on 

Здесь type = 1 означает like и type = 2 означает comment. status = 0 значит seconduser_id еще не увиденное уведомление. seconduser_id - получатель уведомлений.

Можно ли получать уведомления для 1 пользователя (например, seconduser_id = 4), с уведомлением, сгруппированные по type, показывая count и последние user_id для каждого type (в один запрос)?

Реализация этого будет чем-то вроде User3 и еще 10 пользователям понравилось ваше сообщение.

Edit: До сих пор у меня есть что-то, что тянет все уведомления для user 4 и затем группы в PHP. Я не думаю, что это эффективно, поэтому я ищу лучшие решения.

+1

Просьба указать, что вы попробовали. –

+0

Не могли бы вы добавить ожидаемый результат в качестве примера? –

+0

@GordonLinoff сделано отредактировано – pewpewlasers

ответ

1

Основной ответ является запрос агрегации. Усложнение получает последний идентификатор пользователя для каждого типа. Eсть один способ, с помощью substirng_index()/group_concat():

select type, count(*), 
     substring_index(group_concat(user_id order by id desc), ',', 1) as latest_user 
from notifications n 
where secondaryuser_id = 4 and status = 0 
group by type; 

Я не уверен, если вы хотите, чтобы фильтровать по status.

Редактировать (добавлено OP):

Используя приведенный выше код и группировку как post_id и type. Потому что вы хотите сказать User1 и еще 10 понравилось ваше сообщение. Это означает, что для каждого сгруппированного уведомления post_id должен быть уникальным.

SELECT *, substring_index(group_concat(user_id order by id desc), ',', 1) as latest_user, COUNT(post_id) AS total 
FROM notifications n 
WHERE seconduser_id = 4 and status = 0 
GROUP BY post_id, type 
+0

Спасибо за ваш вклад, я немного изменил ваш ответ, чтобы сделать его более практичным. – pewpewlasers

0

Попробуйте это:

SELECT MAX(user_id) AS LatestUser, type, COUNT(type) AS total 
FROM notifications 
WHERE seconduser_id = 4 
GROUP BY type 
Смежные вопросы