为什么我的查询中出现重复的元组?

时间:2019-05-27 15:56:51

标签: mysql sql database group-by duplicates

我正在建立图书馆数据库。

我想编写一个查询,以返回图书馆中的可用书籍(其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”的关系,那么结果是正确的。但是,我也想在结果中显示作者姓名。我怎么了预先感谢!

2 个答案:

答案 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
...
...
...