好吧,我再次发布同样的问题,但这次使用可能有效的替代解决方案。
我有包含以下字段的消息表。
1) id(pk),from_id(fk),to_id(fk),date_entered,消息
我的要求如下。
我需要向登录用户显示与其他用户的最后一条消息。 例如
“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");
现在我有登录用户是发送者或接收者的所有记录。
现在我需要过滤其他用户(john 和 smith)和 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
)
查询的作用是借助 LEAST()
和 GREATEST()< 从
MySQL 中的函数。在表 Messages
表中获取每个用户的最新对话UserList
(包含用户名列表)上加入子查询两次的原因是因为有两列:from_id
,to_id
依赖于此表。
关于php - 重新发布 : Query messages theard list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15739154/