- 此问题在此处已有答案**:
SQL select only rows with max value on a column [duplicate](27个答案)
四年前关闭了。
假设我有一个名为messages
的表,其列为:
id | from_id | to_id | subject | message | timestamp
我只想从每个用户那里得到最新的消息,就像你在深入到实际的线程之前在Facebook收件箱中看到的那样。
这个查询似乎让我接近我需要的结果:
SELECT * FROM messages GROUP BY from_id
然而,查询给我的是来自每个用户的最旧消息,而不是最新消息。
我搞不懂这个。
6条答案
按热度按时间a64a0gku1#
您应该找出每个组(子查询)中最后的
timestamp
值,然后将此子查询连接到表-mkh04yzy2#
试试这个
"
SELECT max(id) FROM messages GROUP BY from_id
"此内部查询,它首先按用户(from_id)对记录/消息进行分组,然后提取最大记录id。然后,我们再次查询消息表,以便仅从内部查询结果集中获取最新记录/消息。muk1a3rh3#
此查询返回每个Form_id最后一条记录:
xsuvu9jc4#
这是一个标准问题。
请注意,MySQL允许您从GROUP BY子句中省略列,而标准SQL不允许,但是当您使用MySQL工具时,通常不会得到确定性结果。
我在
To_ID
上添加了一个过滤器,以匹配您可能需要的内容。没有它,查询也可以工作,但通常会返回更多的数据。不需要在嵌套查询和外部查询中都声明该条件(优化器应该自动将该条件下推),但如图所示重复该条件也没有坏处。i34xakig5#
只是补充Devart所说的,下面的代码不是根据问题排序的:
“GROUP BY”子句必须在主查询中,因为我们需要首先对“SOURCE”重新排序以获得所需的“分组”,因此:
此致,
pcww981p6#
你得点餐。
SELECT * FROM messages GROUP BY from_id ORDER BY timestamp DESC LIMIT 1