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

时间:2016-02-24 08:29:26

标签: mysql sql spring-data spring-data-jpa

这是一个很常见的情况,但我不确定我是否做错了。

TABLE POSTS [ ID, USER_ID, TOPIC_ID, TIME ]

我想只获得每个用户在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

这是对的吗?有没有子查询可以做到这一点?

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

4 个答案:

答案 0 :(得分:1)

您可以使用加入使用子查询获取每个用户的 的最新帖子:

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

答案 1 :(得分:1)

我不确定如何避免sub-query,但另一种方法是

SELECT p.*
FROM   posts p
WHERE  p.time = (SELECT Max(time) mtime
                 FROM   posts pm
                 WHERE  pm.topic_id = 1
                        AND p.user_id = pm.user_id) 

窗口函数Row_number在这种情况下非常有用Mysql不支持

答案 2 :(得分:0)

如果没有子查询,请使用HAVING

SELECT   user_id, topic_id,  time
FROM     posts
WHERE    topic_id = 1
GROUP BY user_id
HAVING time = max(time)

答案 3 :(得分:0)

另一个避免子查询的解决方案(但可能不是那么快)是使用substring_index按时间降序为你想要的最新字段排序,然后使用SUBSTRING_INDEX来获取SUBSTRING_INDEX返回的第一个条目。 / p>

SELECT user_id, 
    SUBSTRING_INDEX(GROUP_CONCAT(`id` ORDER BY `time` DESC), ',', 1),
    SUBSTRING_INDEX(GROUP_CONCAT(`topic_id` ORDER BY `time` DESC), ',', 1),
    SUBSTRING_INDEX(GROUP_CONCAT(`time` ORDER BY `time` DESC), ',', 1)
FROM posts
WHERE    topic_id = 1
GROUP BY user_id