Je ne partage que la partie requête qui résout vos première et deuxième exigences en supposant que vos données restent dans la même structure. Vous pouvez ajouter les jointures et autres détails nécessaires dans votre requête.
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;
Je sais que les fonctions String semblent compliquées, mais pour arriver à la sortie requise, j'ai dû jouer avec les chaînes générées. J'ai un peu modifié votre ensemble de données dans SQL Fiddle pour vérifier ma sortie. Vous pouvez faire la même chose sur :
http://www.sqlfiddle.com/#!2/70a937/49
Faites-moi savoir s'il y a d'autres critères à remplir ou toute amélioration dont vous avez besoin dans la requête.