0

以下のように、送受信されたメッセージの記録を保持するテーブル構造があります。

データベースのテーブル構造

member_id1 は送信者で、member_id2 は受信者です。

今私が達成しようとしているのは、member_id が 3 のユーザーの最新のメッセージを含む行を取得することです。結果には、2 が最後のメッセージであるため、2 と 4 のメッセージ ID を持つ 2 つの行のみが含まれる必要があります。 member_id が 3 のユーザーと member_id が 2 のユーザーの間のメッセージであり、4 は member_id が 3 のユーザーと member_id が 1 のユーザーの間の唯一のメッセージです。

結果には、message_id が 3 の行は含まれません。これは、member_id が 3 で、message_id が 1 のユーザーとは何の関係もないためです。

この問題で私を助けることができる人々のために私の質問を明確にしたことを願っています.

4

3 に答える 3

1

私は自分の質問に対する正しい答えを見つけたと思います。よくわかりませんが、うまく機能しているようです。そんな悩みを解決したい方へ。これを試してください:

SELECT m1.* 
  FROM table_name m1 
  INNER JOIN (SELECT MAX(senddate) AS senddate, 
                     IF(member_id2 = 3, member_id1, member_id2 ) AS user 
                FROM table_name 
               WHERE (member_id1 = 3 AND delete1=0) OR 
                     (member_id2 = 3 AND delete2=0) 
              GROUP BY user) m2 
         ON m1.senddate = m2.senddate AND 
           (m1.member_id1 = m2.user OR m1.member_id2 = m2.user) 
     WHERE (member_id1 = 3 AND delete1=0) OR 
           (member_id2 = 3 AND delete2=0) 
   ORDER BY m1.senddate DESC
于 2012-08-13T02:40:03.147 に答える
0

UNION を使用してそれらを組み合わせることができます

 (SELECT * FROM table_name WHERE member_id2 = 3  ORDER BY senddate DESC limit 1)
union 
 (SELECT * FROM table_name WHERE member_id1 = 3  ORDER BY senddate DESC limit 1)

または、すべてのメンバーの最新の送受信を取得する必要がある場合は、それぞれの最大 senddate を取得するクエリを内部結合できます。

select * from table_name t1 inner join 
(
 select member_id1, null as member_id2, max(senddate) as senddate 
 from table_name group by member_id1
 UNION
 select null as member_id1, member_id2, max(senddate) as senddate 
 from table_name group by member_id2
) r ON (t1.member_id1 = r.member_id1 OR t1.member_id2 = r.member_id2) 
AND t1.senddate = r.senddate 
于 2012-08-12T14:12:14.840 に答える
0

質問は少しあいまいですが、これを探していることがわかりますか?

 SELECT * FROM table_name WHERE member_id2 = 3 ORDER BY senddate DESC;
于 2012-08-12T13:10:12.250 に答える