繁体   English   中英

如何归还每位作者发表的第一本书?

[英]How to return first book published by each author?

问题是

对于每位作者,请返回其第一本书的标题和published_date。 结果集应该有五列:作者的ID,作者的姓名,书籍的ID,书籍的标题和书籍的published_date。

所以我有我想要的输出列,除了它显示每个作者的每本书都有必要的项目,我如何让它只用最早的published_date显示书?

SELECT authors.id, authors.author, books.id, books.title, books.published_date

FROM authors

INNER JOIN books

ON authors.id = books.author_id

解决此问题的一种方法是使用查询从每个作者获取表书中的最小发布日期,然后将其连接到2个表:

select 
  a.id, a.author,
  b.id, b.title, b.published_date
from authors a 
inner join books b on b.author_id = a.id
inner join (
  select author_id, min(published_date) published_date
  from books
  group by author_id
) g on g.author_id = b.author_id and g.published_date = b.published_date 

如果使用最新版本的sqlite(3.25或更高版本),则可以使用窗口函数来实现干净的方法:

鉴于此示例数据库:

CREATE TABLE authors(id INTEGER PRIMARY KEY, author TEXT);
INSERT INTO authors VALUES (1, 'John Steinbeck'), (2, 'William Faulkner');
CREATE TABLE books(id INTEGER PRIMARY KEY
                 , author_id INTEGER REFERENCES authors(id)
                 , title TEXT, published_date TEXT);
INSERT INTO books(author_id, title, published_date) VALUES
 (1, 'The Grapes Of Wrath', '1939-04-14'),
 (2, 'As I Lay Dying', '1930-10-06'),
 (2, 'The Sound And The Fury', '1929-10-07'),
 (1, 'East Of Eden', '1952-09-19'),
 (1, 'Tortilla Flat', '1935-01-01');

这个查询:

WITH ranked(author_id, author, book_id, title, published_date, published_order) AS
 (SELECT a.id, a.author, b.id, b.title, b.published_date
       , rank() OVER (PARTITION BY a.id ORDER BY b.published_date)
  FROM authors AS a
  JOIN books AS b ON a.id = b.author_id)
SELECT author_id, author, book_id, title, published_date
FROM ranked
WHERE published_order = 1
ORDER BY author_id;

将产生:

author_id   author          book_id     title          published_date
----------  --------------  ----------  -------------  --------------
1           John Steinbeck  5           Tortilla Flat  1935-01-01    
2           William Faulkn  3           The Sound And  1929-10-07  

对于每个作者,它为出版顺序中的每本书分配一个等级(在CTE中计算的rank() OVER (PARTITION BY a.id ORDER BY b.published_date)列,然后仅选择等级为1的书籍)为了最终的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM