没有子查询的最新数据分组

qzs*_*ard 5 mysql sql spring-data spring-data-jpa

这是一个很常见的情况,但我不确定我做错了什么.

TABLE POSTS [ ID, USER_ID, TOPIC_ID, TIME ]
Run Code Online (Sandbox Code Playgroud)

我想在topic_id'1'上只获得每个用户的最后一篇文章

SELECT p.*
FROM
  posts p,
  (
    SELECT   user_id, max(time) mtime
    FROM     posts
    WHERE    topic_id = 1
    GROUP BY user_id
  ) pm
WHERE
  p.user_id = pm.user_id AND
  p.time    = pm.mtime
Run Code Online (Sandbox Code Playgroud)

它是否正确?没有子查询,有没有办法做到这一点?

是否有选项可以使用spring-data查询获取此数据,或者这只是JDBC /存储过程?

sag*_*agi 1

您可以通过使用 join 来获取每个用户的最新帖子,而无需使用子查询:

SELECT p.* 
FROM posts p
LEFT OUTER JOIN posts t
ON(p.user_id = t.user_id and p.time < t.time and t.topic_id = 1)
WHERE p.topic_id = 1 and t.topic_id is null
Run Code Online (Sandbox Code Playgroud)

  • @qzshard - 这将取决于索引(很容易更改)和数据。如果您的用户数量相当少而主题数量很大,那么子查询将返回少量行,因此该连接上缺少索引并不重要。但这里的 LEFT OUTER JOIN 会返回大量行,然后在 WHERE 子句中排除大部分行,这会减慢速度。但对于大量用户,每个用户都有少量主题,情况恰恰相反。 (2认同)