MySQL クエリを簡素化するための助けをいただければ幸いです。クエリの目的は、次の列を持つメッセージ テーブル (users_messages) からメッセージを取得することです: message_id、from_id、to_id、message_content、date_sent。
from_id と to_id は、次の列を持つ users テーブル (users) に結合する必要があります: user_id、user_username。
また、ブロックされたユーザー テーブル (users_blocked) があり、このテーブルに user_id 機能がある場合はメッセージを除外します。
これはすべて正常に機能し、メッセージは最新のものから順に並べられます。これが私が望むものです。私の唯一の問題は、対応する「message_content」を取得していないことです。つまり、最新のメッセージではなく、最新の日付を取得しています。
おそらく、別のアプローチ(サブクエリなど)が必要ですが、頭がわかりません。
クエリは次のとおりです。
select m.message_content,
if(from_id < to_id, concat(from_id,to_id), concat(to_id,from_id)) as ft,
if (from_id = $my_id, to_id, from_id) as other_id,
max(date_sent) as most_recent
from users_messages m
left join users_blocked ub1 on (from_id = ub1.blocked_id and ub1.user_id = $my_id)
left join users_blocked ub2 on (to_id = ub2.blocked_id and ub2.user_id = $my_id)
where
(from_id = $my_id or to_id = $my_id)
and ub1.blocked_id is null
and ub2.blocked_id is null
group by
ft
order by
most_recent desc
申し訳ありませんが、テーブル構造は次のとおりです。
ユーザー
user_id user_username 1 シモン 2 琥珀 3 トム
users_messages
message_id from_id to_id date_sent message_content 1 1 2 2012-07-04 11:52:12 こんにちは 2 1 2 2012-07-04 12:32:24 別のメッセージ 3 1 2 2012-07-04 14:00:00 こんにちは。
users_blocked
user_id ブロックされた_id 1 3