3

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

Books(id, title, author_id, date)

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

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

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

4

5 回答 5

5

您可以使用此查询:

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

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

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

于 2013-06-30T15:47:16.567 回答
1
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

演示

于 2013-06-30T16:03:08.157 回答
1

用这个:-

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

于 2013-06-30T15:46:25.970 回答
1

询问:

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)
于 2013-06-30T15:54:46.917 回答
0

在 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,我不确定这是否可行,但可能会。当然,还有其他方法可以做到这一点。

于 2013-06-30T15:56:35.800 回答