mysql 如何使用GROUP BY获取每个组的最新记录?[duplicate]

drkbr07n  于 2023-03-07  发布在  Mysql
关注(0)|答案(6)|浏览(230)
    • 此问题在此处已有答案**:

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

然而,查询给我的是来自每个用户的最旧消息,而不是最新消息。
我搞不懂这个。

a64a0gku

a64a0gku1#

您应该找出每个组(子查询)中最后的timestamp值,然后将此子查询连接到表-

SELECT t1.* FROM messages t1
  JOIN (SELECT from_id, MAX(timestamp) timestamp FROM messages GROUP BY from_id) t2
    ON t1.from_id = t2.from_id AND t1.timestamp = t2.timestamp;
mkh04yzy

mkh04yzy2#

试试这个

SELECT * FROM messages where id in (SELECT max(id) FROM messages GROUP BY from_id ) order by id desc

"SELECT max(id) FROM messages GROUP BY from_id"此内部查询,它首先按用户(from_id)对记录/消息进行分组,然后提取最大记录id。然后,我们再次查询消息表,以便仅从内部查询结果集中获取最新记录/消息。

muk1a3rh

muk1a3rh3#

此查询返回每个Form_id最后一条记录:

SELECT m1.*
     FROM messages m1 LEFT JOIN messages m2
     ON (m1.Form_id = m2.Form_id AND m1.id < m2.id)
     WHERE m2.id IS NULL;
xsuvu9jc

xsuvu9jc4#

这是一个标准问题。
请注意,MySQL允许您从GROUP BY子句中省略列,而标准SQL不允许,但是当您使用MySQL工具时,通常不会得到确定性结果。

SELECT *
  FROM Messages AS M
  JOIN (SELECT To_ID, From_ID, MAX(TimeStamp) AS Most_Recent
          FROM Messages
         WHERE To_ID = 12345678
         GROUP BY From_ID
       ) AS R
    ON R.To_ID = M.To_ID AND R.From_ID = M.From_ID AND R.Most_Recent = M.TimeStamp
 WHERE M.To_ID = 12345678

我在To_ID上添加了一个过滤器,以匹配您可能需要的内容。没有它,查询也可以工作,但通常会返回更多的数据。不需要在嵌套查询和外部查询中都声明该条件(优化器应该自动将该条件下推),但如图所示重复该条件也没有坏处。

i34xakig

i34xakig5#

只是补充Devart所说的,下面的代码不是根据问题排序的:

SELECT t1.* FROM messages t1
  JOIN (SELECT from_id, MAX(timestamp) timestamp FROM messages GROUP BY from_id) t2
    ON t1.from_id = t2.from_id AND t1.timestamp = t2.timestamp;

“GROUP BY”子句必须在主查询中,因为我们需要首先对“SOURCE”重新排序以获得所需的“分组”,因此:

SELECT t1.* FROM messages t1
  JOIN (SELECT from_id, MAX(timestamp) timestamp FROM messages ORDER BY timestamp DESC) t2
    ON t1.from_id = t2.from_id AND t1.timestamp = t2.timestamp GROUP BY t2.timestamp;

此致,

pcww981p

pcww981p6#

你得点餐。
SELECT * FROM messages GROUP BY from_id ORDER BY timestamp DESC LIMIT 1

相关问题