好吧,我再次发布相同的问题,但这一次使用了可能有效的替代解决方案。
我有以下字段的消息表。
1) id(pk)、from_id(fk)、to_id(fk)、date_entered、message
我的要求如下。
我需要向登录用户显示与其他用户的最后一条消息。例如:
"mahendra“是登录用户与"john”进行交流的5条消息,以及与"smith“3条消息。
在这5条和3条消息中,登录用户(Mahendra)可以是发送者(From_id)或接收者(To_id)
我需要显示与每个用户登录用户的最后一次通信。像这样的东西
1)马亨德拉-约翰-这是马亨德拉和约翰之间的最后一条消息2)马亨德拉-史密斯-这是马亨德拉和史密斯之间的最后一条消息
在我的上一篇文章中,我无法通过查询来实现这一点。这就是我所做的。
$result=mysql_query("SELECT * FROM messages WHERE from_id=$_SESSION['userid'] OR to_id=$_SESSION['userid'] ORDER BY date_entered DESC");现在我有登录用户是发送者或接收者的所有记录。
现在我需要过滤其他用户(john和smith)和mahendra中的最后一条消息,并将其带入其他数组;
你知道怎么做吗?
发布于 2013-04-01 15:20:41
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
)查询的作用是借助Messages中的LEAST()和GREATEST()函数从MySQL表中获取每个用户的最新会话。在表UserList (一个包含用户名列表的表)上连接子查询两次的原因是,这个表有两个列:from_id、to_id dependent。
发布于 2013-04-01 15:59:58
也许你想看看这个,用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;这只是query版本,如果您使用的是stored procedure,我建议您将会话变量@user_id替换为本地变量。
https://stackoverflow.com/questions/15739154
复制相似问题