Používám SQL Server 2008, neuvádíte, kterou databázi používáte.
Z informací, které jste poskytli, se váš dotaz zdá příliš složitý pro požadovaný výstup. Zde je jednoduchý dotaz na získání všech zpráv týkajících se uživatele 36:
SELECT
sender.msg_user_name AS sender_user_name
,recipient.msg_user_name AS recipient_user_name
,msg_date
,msg_text
FROM
dbo.Fed_Messages
INNER JOIN dbo.Fed_User AS sender
ON sender.msg_user_id = sender_user_id
INNER JOIN dbo.Fed_User AS recipient
ON recipient.msg_user_id = recipient_user_id
WHERE
sender_user_id = 36
OR recipient_user_id = 36
ORDER BY
msg_date DESC
Musel jsem změnit některá jména polí, protože na serveru SQL Server jsou některá z vybraných názvů vyhrazená slova.
SQL Fiddle:http://sqlfiddle.com/#!3/b8e88/1
UPRAVIT: Nyní jste přidali nějaké další informace a ukázalo se, že existuje id
pole v tabulce zpráv, můžete použít něco takového (poznámka:Mám SQL Server, takže pravděpodobně budete muset změnit dotaz na MySQL):
SELECT sender.msg_user_name AS sender_user_name
,recipient.msg_user_name AS recipient_user_name
,msg_date
,msg_text
FROM dbo.Fed_Messages
INNER JOIN dbo.Fed_User AS sender ON sender.msg_user_id = sender_user_id
INNER JOIN dbo.Fed_User AS recipient ON recipient.msg_user_id = recipient_user_id
INNER JOIN ( SELECT MAX(id) AS most_recent_message_id
FROM dbo.Fed_Messages
GROUP BY CASE WHEN sender_user_id > recipient_user_id
THEN recipient_user_id
ELSE sender_user_id
END -- low_id
,CASE WHEN sender_user_id < recipient_user_id
THEN recipient_user_id
ELSE sender_user_id
END -- high_id
) T ON T.most_recent_message_id = dbo.Fed_Messages.id
WHERE sender_user_id = 36
OR recipient_user_id = 36
ORDER BY msg_date DESC
SELECT
v FROM
část dotazu najde nejnovější zprávu (na základě id
, Předpokládám, že se jedná o automaticky se zvyšující číslo) pro každý objednaný pár ID uživatele odesílatele/příjemce. Výsledek je znovu připojen k Fed_Messages
tabulky, abychom zajistili, že jména odesílatele/příjemce obdržíme správně.
Aktualizované SQL Fiddle:http://sqlfiddle.com/#!3/1f07a/2