0

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
4

3 に答える 3

0

ここでは、SimonKing が次の条件を含む users_messages テーブルからのメッセージ コンテンツを望んでいると想定しています。

  1. ユーザーはどちらの方向もブロックしないでください。
  2. ユーザー間で転送された最新のメッセージ

そのため、Mark Ba​​nnister クエリを次のように変更しました。

SELECT temp.* FROM  (
SELECT um.*, concat(um.from_id,to_id) as direction FROM userMessages um
LEFT JOIN userBlocked ub1 ON um.from_id = ub1.user_id AND um.to_id = ub1.blocked_id
LEFT JOIN userBlocked ub2 ON um.to_id = ub2.user_id AND um.from_id = ub2.blocked_id 
WHERE ub1.user_id is null AND ub1.blocked_id is null AND ub2.user_id is null AND ub2.blocked_id is null
ORDER BY um.date_sent DESC
) temp
GROUP BY direction

SQLフィドルはhttp://sqlfiddle.com/#!2/bdc77/1/0です

于 2013-07-04T14:48:14.937 に答える