[英]Repost : Query messages theard list
好吧,我再次发布了相同的问题,但是这次使用了可能可行的替代解决方案。
我有带有以下字段的消息表。
1)id(pk),from_id(fk),to_id(fk),输入日期,消息
我的要求如下。
我需要向登录用户显示与其他用户的最新消息。 例如
“ mahendra”是一个登录用户,与“ john”通讯的用户说5条消息,而与“ smith”通讯的3条消息。
在这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");
现在,我有了所有登录用户为发送者或接收者的记录。
现在,我需要过滤其他用户(约翰和史密斯)和mahendra中的最后一条消息,并将其放入其他数组中;
知道怎么做吗?
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中的LEAST()
和GREATEST()
函数,从Messages
表中获取每个用户的最新对话。 两次在表UserList
( 包含用户名列表的表)上加入子查询的原因是因为有两列: from_id
, to_id
依赖于此表。
也许您想检查一下,在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
变量@user_id
替换为本地变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.