2016-04-29 46 views
0

我有以下表格:PostgreSQL的:許多到許多與計數房源

  • librairies_books

及以下:

  • A library有許多書通過表libraries_books
  • A book可以通過表 libraries_books屬於許多庫。

我需要顯示庫統計:

Name, Number of copies, Number of books 

因此,如果庫有書-1 3份,並預訂-2 4份,統計應顯示

"Library 1", 7, 2 

7 is the number of total copies 
2 is the number of books 

這是當前的函數,但它不返回有效的書籍數。

create or replace function listing() 
returns table (
    "ID" int, 
    "NAME" varchar, 
    "NUMBER OF COPIES" bigint, 
    "NUMBER OF BOOKS" bigint) as $$ 
begin 
    return query 
    select libraries.id, libraries.name, count(libraries_books.id), count(books.id) 
    from libraries 
    left join libraries_books 
    on libraries.id = libraries_books.library_id 
    left join books 
    on libraries_books.book_id = books.id 
    group by books.id, libraries.id; 
end; 
$$ language plpgsql; 

回答

0

你想要count(distinct)。此外,使用表別名所以查詢更容易編寫和閱讀:

select l.id, l.name, count(distinct l.id), count(b.id) 
from libraries l left join 
    libraries_books lb 
    on l.id = lb.library_id left join 
    books b 
    on lb.book_id = b.id 
group by l.id, l.name; 

您還需要修復的group by,所以它不包括書籍ID。