Ik deel alleen het querygedeelte dat uw eerste en tweede vereisten oplost, ervan uitgaande dat uw gegevens in dezelfde structuur blijven. Je kunt de joins en andere noodzakelijke details toevoegen aan je zoekopdracht.
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;
Ik weet dat de String-functies er ingewikkeld uitzien, maar om tot de vereiste uitvoer te komen, moest ik wat spelen met de gegenereerde Strings. Ik heb je dataset in de SQL Fiddle een beetje aangepast om mijn output te controleren. U kunt hetzelfde doen op:
http://www.sqlfiddle.com/#!2/70a937/49
Laat het me weten als er nog andere criteria zijn waaraan moet worden voldaan of een verbetering die je nodig hebt in de zoekopdracht.