我有以下表格设置:
表名posts
Id, user_id, title, content, date
现在我需要从上表中选择每个用户的最新(最后)帖子 任何人都可以帮忙我们怎么做?
现在我正在使用
SELECT * FROM `posts` GROUP BY `user_id`
ORDER BY `ID` asc
但实际上它只是获取每个用户的第一篇帖子,但我需要每个用户的最后一篇文章
答案 0 :(得分:4)
假设帖子按递增顺序分配:
SELECT max(post_id) AS post_id FROM posts GROUP BY user_id;
如果不能做出这样的假设,你可以这样做:
SELECT user_id, max(date) AS most_recent FROM posts GROUP BY user_id
然后您可以使用它来获取完整帖子:
SELECT p1.*
FROM
(SELECT max(post_id) AS post_id FROM posts GROUP BY user_id) p2
JOIN p1 ON (p1.post_id = p2.post_id);
或无假设案例:
SELECT p1.*
FROM
(SELECT user_id, max(date) AS most_recent FROM posts GROUP BY user_id) p2
JOIN p1 ON (p1.user_id = p2.user_id AND p2.most_recent = p1.date);
如果最近的帖子都具有相同的日期,您将收到来自用户的多个帖子。可以说,这是正确的,因为两者都不是新的。
注意:这些也可以写为相关子查询。基准测试将告诉您哪种情况在您的特定情况下表现最佳。
答案 1 :(得分:1)
SELECT p.*
FROM (
SELECT DISTINCT user_id
FROM posts
) pd
JOIN posts p
ON p.id =
(
SELECT id
FROM posts pi
WHERE pi.user_id = pd.user_id
ORDER BY
user_id DESC, date DESC, id DEST
LIMIT 1
)
在posts (user_id, date, id)
上创建一个索引,以便快速工作。
在此处查看示例4
和3
:
解释了原始查询无效的原因。
答案 2 :(得分:0)
okey这可能是你的问题做一件事
SELECT * FROM
(SELECT * FROM posts ORDER BY date desc) AS `result`
GROUP BY `result`.`user_id`
由于您的示例之前使用的是user_id分组,因此它只需要第一个ID 检查一下它会起作用!
答案 3 :(得分:-2)
好的,这很难看,但确实有效。
MySQL有一个方便的可编辑的组列模式。在其他数据库引擎(如MSSQL)中,如果您使用GROUP BY
,SELECT
中的每一列都必须进行分组,或者应该是聚合函数。
实际上,MySQL所做的是用于分组的第一条记录。所以,如果你这样做:
SELECT * FROM posts GROUP BY user_id ORDER BY ID desc
应该有效。但是,如果没有,则意味着它首先分组并忽略顺序,因此,您可以尝试这样的事情:
SELECT * FROM (SELECT * FROM posts WHERE 1 = 1 ORDER BY ID desc) GROUP BY user_id
将过滤器放在子查询中非常重要,以便将性能保持在可接受的水平。
祝你好运!