mariadb和android-实现消息特性,分别选择用户和消息

sbdsn5lh  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(341)

我有一张留言表。
它的列是 | seq | sender_email | receiver_email | content | date | is_read | sender_profile_icon_url| 在我的android应用程序中,我想先显示用户列表。
您可以想象正常的messenger应用程序,如kakaotalk、line、whatsapp等。

If A ever sent a message to B OR if B ever sent a message to A.

1. A's view

B's information(email, photo) with the most recent message between
B and A must be shown in the list(MessageUserList Activity) of A.
If you click B, you see all the messages between B and A.

2. B's view

A's information(email, photo) with the most recent message between
A and B must be shown in the list(MessageUserList Activity) of A.
If you click B, you see all the messages between B and A.

所以,它看起来像这样(chanjungskim@gmail.com(用户视图):
左:显示至少发送或接收过一条消息的用户。
右:单击第一个用户后显示所有消息(fman1335@gmail).


你应该知道的是你可以给自己发信息。然后,所有消息都将以绿色放置在右侧。
照片看起来很完美。。。但事实并非如此。
我试着用左图。。。

select  m3.*
    from
        ( SELECT  m1.*
            from  message as m1
            left outer join  message as m2  ON m1.sender_email = m2.sender_email
              and  (m1.date < m2.date
                      or  (m1.date = m2.date
                              and  m1.seq < m2.seq)
                   )
            where  m2.sender_email is null
        ) as m3
    where  m3.sender_email=?
       or  m3.receiver_email=?
    order by  date desc
    limit  30;

我试着用正确的图片。。。

select  *
    from  message
    where  sender_email=?
       or  receiver_email=?
       or  sender_email=?
       or  receiver_email=?
    order by  date;

它带来了错误的数据。
目前的问题是
如果a和b互相发送消息,那么a、b在两侧的messageuserlist活动中。它需要分别为一(例如a看到b,b看到a)。如果用户点击了列表中的某个用户,那么它会带来错误的数据。
我不知道该修什么。有什么问题吗?

62o28rlo

62o28rlo1#

要查找“最后一封”电子邮件:

SELECT  *
    FROM  message
    WHERE  sender_email = ...
    ORDER BY  date DESC, seq DESC
    LIMIT  1;

这比使用左连接简单得多,也快得多。
“正确的”查询需要使用这个,我认为:

SELECT  * FROM message
    WHERE  ( sender_email= A  AND  receiver_email = B )
       OR  ( sender_email= B  AND  receiver_email = A )
    ORDER BY date

相关问题