2016-04-29 47 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。