当前位置: 首页 > 面试题库 >

MySQL分组前排序

孙朝明
2023-03-14
问题内容

我需要找到每个作者的最新帖子,然后对结果进行分组,所以我只为每个作者撰写一个最新帖子。

SELECT wp_posts.* FROM wp_posts
        WHERE wp_posts.post_status='publish'
        AND wp_posts.post_type='post'
        GROUP BY wp_posts.post_author           
        ORDER BY wp_posts.post_date DESC

这样可以正确地对输出进行分组,因此每个作者只能得到一篇帖子,但是在对结果进行分组之后而不是在选择之前对结果进行排序


问题答案:

select wp_posts.* from wp_posts
where wp_posts.post_status='publish'and wp_posts.post_type='post'
group by wp_posts.post_author
having wp_posts.post_date = MAX(wp_posts.post_date) /* ONLY THE LAST POST FOR EACH AUTHOR */
order by wp_posts.post_date desc


编辑:

经过一番评论后,我决定添加一些其他信息。

我工作的公司也使用Postgres,尤其是SQL
Server。该数据库不允许此类查询。因此,我知道还有另一种方法(我在下面写了一个解决方案)。如果您不按投影中处理的所有列分组或使用汇总函数,则还应该知道该怎么做。否则就这样吧!

我选择了上面的解决方案,因为这是一个特定的问题。汤姆希望在wordpress网站上获得每位作者的最新帖子。在我看来,如果作者每秒发表一个以上的帖子,则可以忽略不计。WordPress甚至应该通过垃圾邮件双重检测来禁止它。我从个人经验中知道,使用MySQL做这样一个肮脏的小组,对性能有很大的好处。但是,如果您知道自己的工作,那么就可以做到!我在专业负责的应用程序中有如此肮脏的小组。在这里,我的表有一些mio行,需要5到15秒而不是100
++秒。

可能对某些利弊有用:http :
//ftp.nchu.edu.tw/MySQL/tech-resources/articles/debunking-group-by-
myths.html

SELECT
    wp_posts.*
FROM 
    wp_posts
    JOIN 
    (
        SELECT
            g.post_author
            MAX(g.post_date) AS post_date
        FROM wp_posts as g
        WHERE
            g.post_status='publish'
            AND g.post_type='post'
        GROUP BY g.post_author
    ) as t 
    ON wp_posts.post_author = t.post_author AND wp_posts.post_date = t.post_date

ORDER BY wp_posts.post_date

但是如果一个作者每秒多发一篇帖子,那么您将得到的一行多一行,而不是 最后一行

现在,您可以再次旋转轮子,并获得最高职位Id。即使在这里,也至少不能保证您真的得到了最后一个。



 类似资料:
  • 此实例中的任务是获取数据库中每个作者的最新文章。 示例查询产生不可用的结果,因为它并不总是返回的最新消息。 目前公认的答案是 编辑:这个问题是另一个问题的延续,我的具体情况略有不同。您可以(也应该)假设还有一个wp_posts.id是该特定帖子的唯一标识符。

  • 问题内容: 我希望能够从电子邮件表中选择一堆行并按发件人分组。我的查询如下所示: 该查询几乎可以按我希望的方式工作-它选择按电子邮件分组的记录。问题在于主题和时间戳记与特定电子邮件地址的最新记录不符。 例如,它可能返回: 当数据库中的记录是: 如果“编程问题”主题是最新的,那么在对电子邮件进行分组时如何使MySQL选择该记录? 问题答案: 一个简单的解决方案是将查询包裹与ORDER语句子选择 第一

  • 问题内容: 我有这样一张桌子: 我首先要最早的名字: (->不起作用!) 现在它应该让我先发疯(早点约会),然后再给汤姆 但是有了,我会先得到新的疯子,因为它会在排序之前先分组! 再次:问题是我无法在分组之前按日期和时间排序,因为GROUP BY必须在ORDER BY之前! 问题答案: 另一种方法: GROUP BY在其找到的第一个匹配结果上进行分组。如果第一个匹配的碰巧恰好是您想要的匹配,那么一

  • 本文向大家介绍如何在MySQL中按分组字段排序?,包括了如何在MySQL中按分组字段排序?的使用技巧和注意事项,需要的朋友参考一下 要对分组字段进行ORDER BY,请将ORDER BY CASE与一起使用。CASE评估不同的条件,而ORDER BY则按升序或降序对值进行排序。MySQL用于查找匹配项。 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记

  • 问题内容: 所以我有一张桌子,如下所示: 然后,我需要对它们进行分组,排序和排序以给出: 现在,我知道您可以使用temp变量进行排名,例如此处,但是如何对分组集进行排名呢?感谢您的见解! 问题答案: 这以非常简单的方式起作用: 初始查询按第一,第二顺序排序。 并初始化为 用于测试是否输入下一组。如果的先前值(存储在中)不等于当前值(存储在中),则将其清零。否则增加。 分配了新值,并将在下一行的第3

  • 问题内容: 问题很多,但我似乎找不到与我遇到的情况相匹配的问题。我想在前n个查询中执行一些分组。我的数据看起来像这样(显然是假值)。 该表的日期范围涵盖数月,每月有数千行。我想做的是一个查询,告诉我哪个IP地址出现在每个月中最频繁。我可以使用以下方法完成一个月的操作: 但是我真正想要的是能够看到数据集中每个月的前n个。从本质上讲,这禁止了我使用我指定的where子句。当然,当我这样做的时候,我在所