如何在mysql数据库中为用户选择最新帖子?

时间:2011-01-21 05:51:43

标签: php mysql sql

我有以下表格设置:

表名posts

Id, user_id, title, content, date

现在我需要从上表中选择每个用户的最新(最后)帖子 任何人都可以帮忙我们怎么做?

现在我正在使用

SELECT * FROM `posts` GROUP BY `user_id`
ORDER BY `ID` asc

但实际上它只是获取每个用户的第一篇帖子,但我需要每个用户的最后一篇文章

4 个答案:

答案 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)上创建一个索引,以便快速工作。

在此处查看示例43

解释了原始查询无效的原因。

答案 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 BYSELECT中的每一列都必须进行分组,或者应该是聚合函数。

实际上,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

将过滤器放在子查询中非常重要,以便将性能保持在可接受的水平。

祝你好运!