Udostępniam tylko tę część zapytania, która rozwiązuje Twoje pierwsze i drugie wymagania przy założeniu, że Twoje dane pozostają w tej samej strukturze. Do zapytania możesz dodać połączenia i inne niezbędne szczegóły.
SELECT
myView.*,
CONCAT(REPLACE(REPLACE(group_concat(SUBSTRING(notification_message,9)),'</strong>',''),SUBSTRING_INDEX(notification_message,'>',-1),''), SUBSTRING_INDEX(notification_message,'>',-1)) AS Message
FROM
(SELECT DISTINCT
receiver_id,
notification_issuer,
notification_message,
notification_target,
notification_type
FROM imgzer_notifications
WHERE receiver_id = 9 and notification_seen = 1
ORDER BY notification_time DESC) myView
GROUP BY myView.receiver_id, myView.notification_target, myView.notification_type;
Wiem, że funkcje ciągów wyglądają na skomplikowane, ale aby uzyskać wymagane dane wyjściowe, musiałem poeksperymentować z wygenerowanymi ciągami. Zmodyfikowałem trochę twój zestaw danych w SQL Fiddle, aby sprawdzić moje dane wyjściowe. Możesz zrobić to samo pod adresem:
http://www.sqlfiddle.com/#!2/70a937/49
Daj mi znać na wypadek, gdyby w zapytaniu wystąpiły jakieś inne kryteria lub jakiekolwiek ulepszenie, którego potrzebujesz.