好吧我再次发布同样的问题但是这次可能会有其他解决方案。
我有以下字段的消息表。
1)id(pk),from_id(fk),to_id(fk),date_entered,message
我的要求如下。
我需要向其他用户显示登录用户的最后一条消息。 e.g。
在这5和3条消息中,登录用户(mahendra)可以是发送者(from_id)或接收者(to_id)
我需要向每个用户显示与登录用户的最后一次通信。像这样的东西
1)mahendra-john - 这是mahendra和john之间的最后一条消息 2)mahendra-smith - 这是mahendra和smith之间的最后一条消息
在我的上一篇文章中,我无法获得查询来实现此目的。所以这就是我所做的。
$result=mysql_query("SELECT * FROM messages WHERE from_id=$_SESSION['userid'] OR to_id=$_SESSION['userid'] ORDER BY date_entered DESC");
现在我有登录用户是发件人或收件人的所有记录。
现在我需要过滤其他用户(john和smith)和mahendra中的最后一条消息并将其带入其他数组;
知道如何做到这一点?
答案 0 :(得分:2)
SELECT b.Name Fromname,
c.name ToName,
a.date_entered,
a.Message
FROM
(
SELECT *
FROM Messages
where (LEAST(from_id, to_id), GREATEST(from_id, to_id), date_entered) IN
(
SELECT LEAST(from_id, to_id) as fromID,
GREATEST(from_id, to_id) as toID,
MAX(date_entered) as date_entered
FROM Messages
GROUP BY fromID, toID
)
) a
INNER JOIN UserList b
ON a.from_id = b.ID
INNER JOIN UserList c
ON a.to_ID = c.ID
WHERE 'Mahendra' IN (b.name, c.Name)
简要说明
让我们分解完整的查询。查询的核心是这个,
SELECT *
FROM Messages
where (LEAST(from_id, to_id), GREATEST(from_id, to_id), date_entered) IN
(
SELECT LEAST(from_id, to_id) as fromID,
GREATEST(from_id, to_id) as toID,
MAX(date_entered) as date_entered
FROM Messages
GROUP BY fromID, toID
)
查询的作用是通过在MySQL中使用Messages
和LEAST()
函数,获取GREATEST()
表中每个用户的最新会话。在表UserList
(包含用户名列表的表)上加入子查询两次的原因是因为有两列:from_id
,to_id
依赖于这张桌子。
答案 1 :(得分:0)
也许您想查看一下,在SQL Fiddle
中回答这是我的疑问:
SET @user_id = 1;
SELECT COUNT(M.Id) AS MessageCount
, IF(M.from_id = @user_id, M.to_id, M.from_id) AS CommunicatedWith
, (SELECT message FROM messages WHERE id = MAX(M.id)) AS LastMessage
FROM messages AS M
WHERE M.from_id = @user_id OR M.to_id = @user_id
GROUP BY CommunicatedWith;
这只是查询版本,如果您使用的是stored procedure
,我建议您使用本地变量替换会话变量@user_id
。