我有一个页面显示与您聊天的人的列表。目前它正在显示您一直在聊天的人,以及最旧的消息。但是,它应该显示最新消息。这是查询:
SELECT * FROM post
WHERE fk_user_to = '$userid'
GROUP BY fk_user_from
ORDER BY datotime DESC
和表结构
post_id || fk_user_to || fk_user_from || message || datotime
我有一个页面显示与您聊天的人的列表。目前它正在显示您一直在聊天的人,以及最旧的消息。但是,它应该显示最新消息。这是查询:
SELECT * FROM post
WHERE fk_user_to = '$userid'
GROUP BY fk_user_from
ORDER BY datotime DESC
和表结构
post_id || fk_user_to || fk_user_from || message || datotime
这解决了:
SELECT * FROM
(SELECT * FROM post ORDER BY datotime DESC) as inv
WHERE fk_user_to = '$userid'
GROUP BY fk_user_from
ORDER BY datotime DESC
我认为没有简单的 SQL 解决方案。如果您的数据库系统允许子查询,您必须执行子查询,例如
SELECT fk_user_from AS id, MAX(dateotime) AS newest_timestamp FROM post WHERE fk_user_to = '$userid'
然后post
使用这两个字段作为键再次从中选择。
在 MySQL 中,可能类似于:
SELECT * FROM post P1
JOIN (
SELECT fk_user_from, MAX(dateotime) AS newest_dateotime
FROM post
WHERE fk_user_to = '$userid'
GROUP BY fk_user_from
) AS P2
ON P1.fk_user_from=P2.fk_user_from
AND P1.datotime =P2.newest_dateotime
WHERE P1.fk_user_to = '$userid'
它真的不是那样工作的。您永远无法确定 GROUP BY 选择了哪一行,因此在其上放置 ORDER BY 将产生不可预测的输出。您也不能在 GROUP BY 之前下订单。
尝试这个:
SELECT *,MAX(datotime) AS dt fk_user_from
FROM post
WHERE fk_user_to = '$userid'
GROUP BY fk_user_from
ORDER BY dt