2017-03-11 53 views
-1

我有我想要显示像Facebook消息的消息应用程序,它应该由发送者或接收者获取最后发送的消息,我的表布局是这样的:获取用户之间的最后一条消息,如Facebook

messages_tbl

__________________________________________________________________________ 
|id | user1Fk| user2Fk |subject | user1Delete | user2Delete | dateCreated | 

和我user_tbl

_______________________________________ 
| id | first_name | last_name | image | 

我查询

SELECT `id` , `user1Fk` as sender_id, 
     (SELECT concat(first_name,\" \",last_name) 
     FROM user_tbl 
     WHERE user_tbl.id = sender_id 
     ) as senderName, 
     `user2Fk` as recipient_id , 
     (SELECT concat(first_name,\" \",last_name) 
     FROM user_tbl 
     WHERE user_tbl.id = recipient_id 
     ) as recipientName, 
     (SELECT image 
     FROM user_tbl 
     WHERE user_tbl.id = sender_id 
     ) as senderImage, 
     (SELECT image 
     FROM user_tbl 
     WHERE user_tbl.id = recipient_id 
     ) as recipientImage, 
     `subject`, `message`, `user1Delete`, `user2Delete`, 
     `dateCreated` 
    FROM `message_tbl`as m1 
    WHERE dateCreated = (SELECT MAX(m2.dateCreated) 
         from message_tbl as m2 
         WHERE (m1.user1Fk = m2.user1Fk 
           AND m1.user2Fk = m2.user2Fk 
           OR m1.user1Fk = m2.user2Fk 
           AND m1.user2Fk = m2.user1Fk 
          ) 
         ) AND ? IN (m1.user1Fk, m1.user2Fk) 
    ORDER BY dateCreated DESC 

此查询工作的大部分,但其缺乏的,我想它来检查,如果由?比赛user1Fk定id应该再检查,如果user1Delete是0或1,如果一个1然后做不显示消息user 1删除它,与用户2相同,但我想不到的逻辑,任何人都可以帮助我吗?

+0

类似于https://stackoverflow.com/questions/42740768/mysql-distincs-entry-of-two-columns-even-when-switched/42740903#42740903 – Gab

+0

差不多,但我的已经可以选择了,我只需要帮助检查消息是否已被删除,然后返回 –

回答

0

我假设问号出现了,因为这是一个准备好的查询,问号应该用用户ID替换。

由于有很多子选择,因此您的查询有点复杂。为了获得更好的性能,我试图改进它以便能够更轻松地进行扩展。使用SQL,您可以连接表而不是使用子查询,这对性能更好,并且可以更轻松地为连接的表添加条件。

在下面的示例中,我将user1和user2删除字段的条件都添加为0.我将限制设置为1,这意味着只返回第一行。与日期的降序一起,这意味着只有最新的消息才会被返回。我还将问号更改为:user_id,因为在此示例中它使用了两次,这样您只需添加一次即可。

SELECT 
    m.id, 
    u1.id AS sender_id, 
    CONCAT(u1.first_name, ' ', u1.last_name) AS senderName, 
    u2.id AS recipient_id, 
    CONCAT(u2.first_name, ' ', u2.last_name) AS recipientName, 
    u1.image AS senderImage, 
    u2.image AS recipientImage, 
    m.subject, 
    m.message, 
    m.user1Delete, 
    m.user2Delete, 
    m.dateCreated 
FROM messages_tbl m 
INNER JOIN user_tbl u1 ON m.user1Fk = u1.id 
INNER JOIN user_tbl u2 ON m.user2Fk = u2.id 
WHERE (m.user1Delete = 0 AND u1.id = :user_id) 
OR (m.user2Delete = 0 AND u2.id = :user_id) 
ORDER BY m.dateCreated DESC 
LIMIT 1 

我还没有能够测试它,但我希望这是你在找什么。

+0

查询是好的,但是在user1delete为1的情况下,即使user1 id不是给定的ID,也不会显示消息 –

+0

啊对。那这个呢? WHERE(m.user1Delete = 0和u1.id =:USER_ID) OR(m.user2Delete = 0和u2.id =:USER_ID) ORDER BY m.dateCreated DESC LIMIT 1 – Asperitas

+0

这工作,纠正你的回答,我标记它。 –

相关问题