私はSQLServer2008を使用していますが、使用しているデータベースはわかりません。
提供した情報から、クエリは必要な出力に対して非常に複雑に見えます。ユーザー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
SQL Serverの場合、選択した名前の一部は予約語であるため、一部のフィールド名を変更する必要がありました。
SQLフィドル: http://sqlfiddle.com/#!3/b8e88/1 >
編集: これで、さらにいくつかの情報が追加され、id
があることが示されました。 メッセージテーブルのフィールドには、次のようなものを使用できます(注:SQL Serverを使用しているため、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
FROM
で クエリの一部は、最新のメッセージを検索します(id
に基づく) 、送信者/受信者のユーザーIDの順序付けられたペアごとに、自動インクリメント番号であると想定しています。その結果は、Fed_Messages
に再結合されます。 送信者/受信者の名前が正しいことを確認するための表。
更新されたSQLフィドル: http://sqlfiddle.com/#!3/1f07a/2