Споделям само частта със заявка, която решава вашите първи и втори изисквания, като се приеме, че вашите данни остават в същата структура. Можете да добавите връзките и други необходими подробности в заявката си.
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;
Знам, че функциите String изглеждат сложни, но за да стигнем до необходимия изход, трябваше да си поиграем с генерираните низове. Промених малко вашия набор от данни в SQL Fiddle, за да проверя изхода си. Можете да направите същото на:
http://www.sqlfiddle.com/#!2/70a937/49
Уведомете ме, в случай че има други критерии, които трябва да бъдат изпълнени, или някакво подобрение, което изисквате в заявката.