获取Facebook等用户之间的最后一条消息

时间:2017-03-11 22:37:29

标签: php mysql mysqli

我有一个消息应用程序,我想显示像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

此查询大部分都有效,但缺少,我希望它检查,如果?的给定ID与user1Fk匹配,则应检查user1Delete是否为0或1,如果它是1然后不显示消息user 1删除它,与用户2相同,但我想不到逻辑,任何人都可以帮助我吗?

1 个答案:

答案 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

我还没有能够测试它,但我希望这是你想要的。