2

我有一个页面显示与您聊天的人的列表。目前它正在显示您一直在聊天的人,以及最旧的消息。但是,它应该显示最新消息。这是查询:

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
4

3 回答 3

2

这解决了:

    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
于 2012-07-29T22:55:01.763 回答
0

我认为没有简单的 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'
于 2012-07-29T22:30:01.333 回答
0

它真的不是那样工作的。您永远无法确定 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
于 2012-07-29T22:21:49.713 回答