sql查询,用于查找有多少书的评论超过20篇

vu8f3i0k  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(454)

我是新的sql查询和我有麻烦的以下问题。我们有一张书评表( review_id, book_id,... )还有一张table review_good_bad ( review_id, IsGood )这就说明了评审的好坏。 Review_id 在table上 review_good_bad 是外键 IsGood 是布尔值。我得找出多少书至少有20篇评论。
我试过这个:

Select count(dinstict r.book_id)
From reviews r, review_good_bad rgb
Where r.review_id = rgb.review_id
Group by r.book_id
Having count (rgb.IsGood) >= 20

但这不是我想要的。有什么想法吗?
提前谢谢

blmhpbnm

blmhpbnm1#

不能在GROUPBY子句中使用的列上进行聚合。
将查询用作子查询并聚合到:

select count(*)
from (
  select r.book_id
  from reviews r inner join review_good_bad rgb
  on r.review_id = rgb.review_id
  group by r.book_id
  having count(rgb.IsGood) >= 20
) t
dgiusagp

dgiusagp2#

如果您想要代码建议的良好评价:

select count(*)
from (select book_id
      from reviews r
           review_good_bad rgb
           using (book_id)
      where rgb.IsGood
      group by book_id
     ) r;

做不必要的比较——比如你的代码对 isGood --充其量是误导性的,会导致糟糕的表现。聚合前过滤通常会提高性能。
请注意,您的数据结构实际上没有意义。你应该把它储存起来 IsGoodreviews table。
这也用正确的、明确的、标准的、可读的语法替换了你的古老语法 JOIN 语法。这也允许一些细节,比如 using 条款。
如果你不需要 IsGood 那么它不应该是查询中的引用。它也不应该放在table上。只需使用:

select count(*)
from (select r.book_id
      from reviews r
      group by book_id
      having count(*) >= 20
     ) r;

这应该是你问题的最简单答案(如果不是关于好的评论的话)。

相关问题