【问题标题】:sql return only max date for each idsql 只返回每个 id 的最大日期
【发布时间】:2023-03-03 08:30:25
【问题描述】:

我有一个数据库,其中一张表看起来像这样

Books(id, title, author_id, date)

我在日期字段中使用 DATE 类型。

查询要做的是只返回每个作者的最新书籍,因此即使对于具有相同 author_id 的书籍,也只返回具有该作者最近日期字段的书籍。因此,对于所有书籍,找到每个作者的最新书籍,返回标题、author_id 和日期。

我相信我需要使用 MAX 函数和 GROUP BY author_id....或者可能包含 HAVING max(date)?附带说明一下,在返回日期时是否有可能将其发布到小数点后的年份(以年为单位)? (例如 3.1 如果预订日期刚刚超过 3 年?)。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你可以使用这个查询:

    SELECT *
    FROM Books
    WHERE (author_id, date) IN (SELECT author_id, MAX(date)
                                FROM Books
                                GROUP BY author_id)
    

    子查询将为每个作者返回一本书的最大日期。外部查询将返回每个作者的所有书籍,日期最长。

    请注意,如果每个作者在相同的最长时间内出版,这可能会为每位作者返回不止一本书。

    【讨论】:

      【解决方案2】:

      查询:

      SELECT b.*
      FROM Books b
      WHERE b.id = (SELECT b2.id
                    FROM Books b2
                    WHERE b2.author_id = b.author_id
                    ORDER BY b2.date desc
                    LIMIT 1)
      

      【讨论】:

        【解决方案3】:
        SELECT b1.*
        FROM Books b1
        JOIN (
            SELECT author_id, MAX(date) date
            FROM Books
            GROUP BY author_id
        ) b2
          ON b2.author_id = b1.author_id
         AND b2.date = b1.date
        

        demo

        【讨论】:

        • +1 可能是此处所有(有效)答案中最有效的,索引为(author_id, date)
        【解决方案4】:

        使用这个:-

        SELECT id,title,author_id,date
        FROM Books t1
        WHERE t1.id = (SELECT t2.id
                      FROM Books t2
                      WHERE t2.author_id = t1.author_id
                      ORDER BY t2.date desc
                      LIMIT 1)
        

        此查询将返回每位作者的最新书籍。

        检查这个:- SQL FIDDLE

        【讨论】:

        • 因为它可能会给出错误的结果:fiddle-2
        • @ypercube 是的,你说得对。但是 OP 要求他需要每位作者的最新书。那么是否需要子查询?
        • 唯一需要的是显示所有列,这在没有子查询的情况下使用单个查询是不可能的。不是吗?如果我错了,请纠正我:)
        • 小提琴是错误的(日期格式不正确)但新查询看起来正确sqlfiddle.com/#!2/d7a08/1所以我删除了downvote
        【解决方案5】:

        在 SQL-Server 上,我会写这样的东西来查找每个作者的最近日期:

        Select author_id, Max(date) From Books Group By author_id
        

        然后您可以使用对此的修改作为子查询来查找每位作者的最新书籍:

        Select B.* from Books as B
        where B.date = (Select Max(date) From Books B2 where B2.author_id = B.author_id)
        

        对于 MySQL,我不确定这是否可行,但可能会。当然,还有其他方法可以做到这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-11
          • 1970-01-01
          • 1970-01-01
          • 2015-10-12
          • 1970-01-01
          相关资源
          最近更新 更多