我在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, 显示名称, 关于我, 密码,
ID, from_id, to_id, 信息, add_dt, 删除, is_read,
ID, 用户身份, user_ip, 用户代理, login_dt,
提前致谢。
答案 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
来检查它是否是一个对话,然后按其排序,以便所有对话都在最顶层,然后是没有对话的用户。