我有一个数据库,其中一个表看起来像这样
Books(id, title, author_id, date)
我在日期字段中使用DATE类型。
查询要做的是仅返回每位作者的最新书籍,因此即使对于具有相同author_id的书籍,也只返回具有该作者最新日期字段的书籍。因此,对于所有书籍,每个作者都会找到最新的书籍,返回标题,author_id和日期。
我相信我需要将MAX函数与GROUP BY author_id ....一起使用,或者可能包含一个HAVING max(日期)?一个侧面注释是否可以在返回日期时将它的年龄提高到1个小数点? (如果预订日期超过3年,则为3.1)。
答案 0 :(得分:4)
您可以使用此查询:
SELECT *
FROM Books
WHERE (author_id, date) IN (SELECT author_id, MAX(date)
FROM Books
GROUP BY author_id)
子查询将为每个作者返回一本书的最大日期。外部查询将返回具有最大日期的每位作者的所有书籍。
请注意,如果每位作者以相同的最长日期发布,这可能会为多位作者返回多本书。
答案 1 :(得分: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
答案 2 :(得分:0)
使用: -
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
答案 3 :(得分:0)
查询:
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)
答案 4 :(得分: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,我不确定这是否可行但可能会有效。当然,还有其他方法可以做到这一点。