我正在建立图书馆数据库。
我想编写一个查询,以返回图书馆中的可用书籍(其isbns,标题,作者姓名,出版名称,类别名称和可用副本数。
我的查询涉及以下关系(加粗的是主键):
将书(ISBN ,书名,pubYear,numpages,pubName )发布给出版商
将ISBN FK复制(ISBN,copyNr ,书架)
借入(memberID,ISBN,copyNr,date_of_borrowing ,date_of_return )将MemberID FK授予成员,将ISBN FK授予“图书”,将(ISBN,copyNr)FK获得复制
属于(ISBN,categoryName) SBN FK到Book,categoryName FK到category
文字作者(ISBN,authID),ISBN FK代表图书,authID FK代表作者
作者(authID ,AFirst,ALast,出生日期)
我的方法如下:
SELECT b.isbn, b.title,a.ALast, a.ALast, b.pubName, be.categoryName , COUNT(b.isbn) as Number_of_copies_available
FROM copies as c
INNER JOIN book as b ON c.isbn = b.isbn
INNER JOIN belong_to as be ON b.isbn = be.isbn
INNER JOIN written_by as w ON w.isbn=b.isbn
INNER JOIN author as a ON a.authID = w.authID
WHERE (c.isbn,c.copyNr) NOT IN (SELECT isbn, copyNr FROM borrows)
GROUP BY b.isbn
ORDER BY be.categoryName
问题是在分组之前,我在结果上得到了重复的元组,这导致每个组有更多的项目。
例如,对于某些书籍,我得到的Number_of_copies_available的属性值比预期的大一倍。
如果我不JOIN
处理“ write_by”和“ author”的关系,那么结果是正确的。但是,我也想在结果中显示作者姓名。我怎么了预先感谢!
答案 0 :(得分:2)
当它们之间没有完美的关联时,不要直接加入表。一本书的类别实际上与一本书的作者无关。有两个作者和两个类别,您将哪个作者与哪个类别组合?将它们组合起来是没有意义的(并且可能最终以所有组合形式结束)。因此,首先聚合,然后再加入聚合。这是一个示例:
select
b.isbn,
b.title,
b.pubName,
aut.authors,
cat.categories,
cop.total - coalesce(bor.total, 0) as available
from book b
join
(
select w.isbn, group_concat(a.alast) as authors
from written_by w
join author a ON a.authID = w.authID
group by w.isbn
) aut ON aut.isbn = b.isbn
join
(
select isbn, group_concat(categoryname) as categories
from belong_to
group by isbn
) cat ON cat.isbn = b.isbn
join
(
select isbn, count(*) as total
from copies
group by isbn
) cop ON cop.isbn = b.isbn
left join
(
select isbn, count(*) as total
from borrows
where date_of_return > current_date
group by isbn
) bor ON bor.isbn = b.isbn
order by b.isbn;
答案 1 :(得分:1)
还是有点困惑。你能解释一下我的错误到底在哪里吗 是,我该如何解决?
这并不是真正的答案,因为这种“评论”很重要。
但是更多的SQL 92有效重写将大致如下所示。
但是由于您没有提供示例数据和预期结果,所以我真的在猜测您需要什么
查询
SELECT
book.isbn
...
FROM
book
INNER JOIN (
SELECT
COUNT(book.isbn) AS Number_of_copies_available
FROM
book
INNER JOIN
copies
ON
book.isbn = copies.isbn
... # borrows table should also be needed here to be filterd?
) AS book_copies__count
ON
...
...
...