Condivido solo la parte della query che risolve il primo e il secondo requisito presupponendo che i dati rimangano nella stessa struttura. Puoi aggiungere i join e altri dettagli necessari nella tua query.
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;
So che le funzioni String sembrano complicate, ma per arrivare all'output richiesto, ho dovuto giocare con le stringhe generate. Ho modificato leggermente il tuo set di dati in SQL Fiddle per controllare il mio output. Puoi fare lo stesso su:
http://www.sqlfiddle.com/#!2/70a937/49
Fammi sapere nel caso in cui ci siano altri criteri da soddisfare o qualsiasi miglioramento necessario nella query.