首先获取最新会话(消息)的用户,然后从两个表中进行无会话的其他会话

时间:2016-06-28 06:02:13

标签: mysql

我在mysql查询中有一个混乱。我有两个用于消息和用户的表,所以我想要的结果就像首先有最新会话的用户,然后是其他用户。我陷入了困境。所以任何人都可以帮忙吗? 目前我有这个查询,但它仅适用于存在会话的用户。

select * from (SELECT DISTINCT IF( from_id = $user_id, to_id, from_id ) AS uid,u.display_name,u.username,(SELECT count(*) from user_online uo where uo.user_id = u.id) as online,um.message,um.add_dt
FROM  `user_messages` um INNER JOIN users u ON u.id=IF( from_id = $user_id, to_id, from_id )
WHERE  (to_id = $user_id OR `from_id` = $user_id)

ORDER BY  `add_dt` DESC )tbl GROUP BY uid ORDER BY `add_dt` DESC LIMIT $offset,$records

模式

用户

ID, 电子邮件, 用户名, fb_id, 显示名称, 关于我, 密码,

user_messages

ID, from_id, to_id, 信息, add_dt, 删除, is_read,

user_online

ID, 用户身份, user_ip, 用户代理, login_dt,

提前致谢。

1 个答案:

答案 0 :(得分:1)

我已经改变了你的逻辑。

在派生表conversations中,我已将messages加入online users并将limit放入其中,因为毕竟您正在限制conversations

然后我将结果加入users表,只获取conversations中的用户。防止昂贵的连接。

SELECT 
    IF(conversations.uid IS NOT NULL, 1, 0) AS `isConversation`, 
    conversations.`online`, 
    (SELECT message FROM user_messages WHERE id = conversations.message_id) as `message`, -- get message
    conversations.add_dt, 
    u.id AS uid, 
    u.display_name, 
    u.username 
FROM
(
    SELECT 
        IF( um.from_id = $user_id, um.to_id, um.from_id ) AS uid,
        IF(user_id is not null, 1, 0) AS `online`   -- online status
        MAX(um.id) AS `message_id`, -- get latest message id to get message
        MAX(um.add_dt) AS `add_dt` -- get last message time for the particular user
    FROM user_messages um 
        LEFT JOIN user_online uo
        ON uo.user_id = IF( um.from_id = $user_id, um.to_id, um.from_id )
    WHERE 
        ( um.to_id = $user_id OR um.from_id = $user_id )
    GROUP BY -- group by uid
        uid
    ORDER BY    -- sort by latest message
        add_dt DESC 
    LIMIT   -- limit the conversations
        0, 15
) AS conversations
LEFT JOIN users u   -- to get all users
ON conversations.uid = u.id
ORDER BY
    `isConversation` DESC
LIMIT   -- limit the users
    0, 15

更新

我添加了一列isConversation来检查它是否是一个对话,然后按其排序,以便所有对话都在最顶层,然后是没有对话的用户。

相关问题