2013-08-01 28 views
19

Tôi có hai bảng SQLite như thế này:Cách chọn N hàng đầu tiên của mỗi nhóm?

AuthorId | AuthorName 
---------------------- 
1  | Alice 
2  | Bob 
3  | Carol 
...  | .... 


BookId | AuthorId | Title 
---------------------------------- 
1  | 1  | aaa1 
2  | 1  | aaa2 
3  | 1  | aaa3 
4  | 2  | ddd1 
5  | 2  | ddd2 
... | ...  | ... 
19  | 3  | fff1 
20  | 3  | fff2 
21  | 3  | fff3 
22  | 3  | fff4 

Tôi muốn thực hiện một truy vấn SELECT sẽ trả lại N đầu tiên (ví dụ như hai) hàng cho mỗi AuthorId, đặt hàng theo Tiêu đề ("Chọn hai cuốn sách đầu tiên của mỗi tác giả "). sản lượng

mẫu:

BookId | AuthorId | AuthorName | Title 
------------------------------------------ 
1  | 1  | Alice | aaa1 
2  | 1  | Alice | aaa1 
4  | 2  | Bob  | ddd1 
5  | 2  | Bob  | ddd2 
19  | 3  | Carol | fff1 
20  | 3  | Carol | fff2 

Làm thế nào tôi có thể xây dựng truy vấn này?

(Có, tôi đã tìm thấy chủ đề tương tự và tôi biết cách trả về chỉ một hàng (đầu tiên hoặc trên cùng). Vấn đề là với hai câu hỏi).

+0

Có người đã có một vấn đề tương tự ở đây http://stackoverflow.com/questions/9518900/how-to-find-teams-with-sql-command –

+0

Vui lòng xem [ "nên câu hỏi bao gồm‘thẻ’trong họ tiêu đề? "] (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), trong đó sự đồng thuận là" không, họ không nên "! –

Trả lời

12

Bạn có thể làm đếm sử dụng một subquery tương quan:

SELECT b.BookId, a.AuthorId, a.AuthorName, b.Title 
FROM Author a join 
    Book b 
    on a.AuthorId = b.AuthorId 
where (select count(*) 
     from book b2 
     where b2.bookId <= b.BookId and b2.AuthorId = b.AuthorId 
    ) <= 2; 

Đối với một cơ sở dữ liệu nhỏ này nên được tốt. Nếu bạn tạo chỉ mục tổng hợp trên Book(AuthorId, BookId) thì điều đó sẽ giúp truy vấn.

13

Có biến thể thay thế:

SELECT * FROM (
    SELECT * FROM BOOK, AUTHOR 
    WHERE BOOK.AUTHORID = AUTHOR.AUTHORID 
) T1 
WHERE T1.BOOKID IN (
    SELECT T2.BOOKID FROM BOOK T2 
    WHERE T2.AUTHORID = T1.AUTHORID 
    ORDER BY T2.BOOKTITLE 
    LIMIT 2 
) 
ORDER BY T1.BOOKTITLE 
+0

Tôi thích câu trả lời này tốt hơn cho trường hợp cụ thể của tôi, nhưng MySQL không hỗ trợ "giới hạn" bên trong "trong" truy vấn phụ, vì vậy tôi phải đi với giải pháp khác ...: (upvoted anyway :) – msb

0

Ở đây bạn đi. Có thể đã quá muộn nhưng tôi chỉ thấy bài đăng. Bạn có thể thay đổi số < = 2 để khớp với số n bạn cần.

SELECT 
a.authorid, 
a.authorname, 
b.bookid, 
b.booktitle 
FROM author a 
JOIN book b ON b.authorid = b.authorid 
QUALIFY ROW_NUMBER() OVER (PARTITION BY a.authorid 
ORDER BY b.booktitle ASC) <=2 
+2

Điều này không đủ điều kiện 'như một câu trả lời SQLite :-) – user1735003