这是一个很常见的情况,但我不确定我是否做错了。
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 /存储过程?
答案 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