2013-09-25 57 views
2

我在表中有以下數據。MySQL內部連接限制結果從第二個表

 
Table Books 
Id | Book_Name 
1 | Java Programming 
2 | PHP Programming 
3 | HTML5 

Table Chapters 
Book Id | Chapter_Number 
1  | Chapter 1 
1  | Chapter 1v2 
1  | Chapter 1v3 
2  | Chapter 2 Release 1 
2  | Chapter 2 Rev. 
3  | Chapter 1 
4  | Chapter 1 

我想達到的目的是將章節號數據返回從每個書本章只限制到2行。我想

 
Book Id | Book Name | Chapter_Number 
1 | Java Programming | Chapter 1 
1 | Java Programming | Chapter 1v2 
2 | Java Programming | Chapter 2 Release 1 
2 | Java Programming | Chapter 2 Rev. 
3 | Java Programming | Chapter 1 
4 | Java Programming | Chapter 1 

數據

實例有沒有辦法得到這個?

回答

4

執行此操作的一種方法是引入rank列。您可以通過使用user-defined variablesmysql做到這一點:

select * 
from (
    select b.id, 
     b.book_name, 
     c.chapter_number, 
     @rnk:=IF(@prevbookid=b.id,@rnk+1,1) rnk, 
     @prevbookid:=b.id 
    from books b 
    join chapters c on b.id = c.bookid 
    join (select @rnk:= 0, @prevbookid:= 0) t 
    order by b.id, c.chapter_number 
) t 
where rnk <= 2 
+1

使用用戶定義變量的好主意。聰明的回答。 –

+0

適合我的需求。謝謝:) – Syed

+0

@drgbox - np,很高興我們可以幫助! – sgeddes

0

我不知道你怎麼能做到這一點只用SQL。你可以用一些像這樣的代碼的幫助下做到在SQL:

首先,讓章ID列表:

select distinct id from Chapter; 

然後你不得不在每個ID迭代(代碼)運行如下查詢:

select * from Chapter join Book on Book.id = Chapter.Book_id where Chapter.Book_id=(the iterated id) limit 2; 

很明顯,這不是非常具有伸縮性,因爲您必須對列表中的每個id運行查詢。這是一個很好的問題。我會投票。也許有人可以提供只有SQL的答案。