2013-06-30 46 views
2

我有一個表,看起來像這樣SQL中每個ID

Books(id, title, author_id, date) 

我使用類型爲DATE日期字段數據庫只返回最大日期。

查詢所要做的僅僅是返回每個作者的最新書籍,所以即使對於具有相同author_id的書籍也只返回該作者最近的日期字段的書籍。因此,對於所有書籍,請查找每位作者的最新書籍,並返回標題,author_id和日期。

我相信我需要使用MAX函數與GROUP BY author_id ....或者可能包含HAVING max(date)?在回覆日期時,它可能會有多年的年齡,並且已經發布到小數點後一位,這樣可以排序嗎? (如果書籍日期剛剛超過3歲,則爲3.1)。

回答

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

+0

爲什麼downvoted? –

+0

因爲它可能會給出錯誤的結果:[fiddle-2](http://sqlfiddle.com/#!2/d2426/1) –

+0

@ypercube是的你說得對。但OP問他需要每個作者最近的書。那麼是否需要子查詢? –

4

您可以使用此查詢:

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

子查詢將返回,每一個作家,一本書的最大日期。外部查詢將返回具有最大日期的每個作者的所有書籍。

請注意,如果每個作者在相同的最大日期發佈,這可能會爲每位作者返回多本書。

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) 
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,我不知道這是否會工作但可能會這樣。當然,還有其他方法可以做到這一點。

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 

​​

+0

+1這裏可能是所有(有效)答案中最有效的,並且在'(author_id,date)'上有一個索引 –