【问题标题】:Comparing two COUNTS in SQL比较 SQL 中的两个 COUNTS
【发布时间】:2020-10-29 04:56:44
【问题描述】:

我有以下数据库:

CREATE TABLE Book (title VARCHAR(80), author VARCHAR(80), genre VARCHAR(80));
CREATE TABLE Review (reviewername VARCHAR(80), title VARCHAR(80), rating VARCHAR(10));
CREATE TABLE Reviewer (reviewername VARCHAR(80), genre VARCHAR(80));

我想查找所有评论者所评论的涵盖该类型的书籍 书。换句话说,分类为 G 类型的标题在答案 iff 中 每个涵盖类型 G 的评论家都写过这篇文章的评论。 注意:如果某些类型 G 未被任何评论者涵盖,则所有书籍 其流派是 G 应该在答案中。答案应该有 一个属性标题。

我的想法是计算每本书的评论数。

Select  COUNT(B.title) FROM Book B, Review R 
where B.title=R.title Group by B.title;

并且还要统计每个流派的审稿专家数量:

Select COUNT(R.reviewername) FROM Review R, Reviewer V
WHERE V.reviewername=R.reviewername group by V.genre;

然后比较这两个计数是否相等。如果它们相同,则意味着特定类型的所有专家都审查了所有书籍。但是当我尝试比较计数时:

 Select B.title FROM Book B 
    WHERE 
    (Select COUNT(R.reviewername)
    FROM Review R, Reviewer V 
    WHERE V.reviewername=R.reviewername  group by V.genre) = (Select  COUNT(B.title)
    FROM Book B, Review R  
    where B.title=R.title Group by B.title);

我得到错误:

子查询返回多于 1 行

请注意,我不想使用 JOIN。

示例数据和表定义:

CREATE TABLE Book (title VARCHAR(80), author 
VARCHAR(80), genre VARCHAR(80));
CREATE TABLE Review (reviewername VARCHAR(80), title VARCHAR(80), rating VARCHAR(10));
CREATE TABLE Reviewer (reviewername VARCHAR(80), genre VARCHAR(80));
INSERT INTO Book VALUES ("Learning SQL", "Victor", "Education");
INSERT INTO Book VALUES ("Learning SQL Part 2", "Victor", "Education");
INSERT INTO Book VALUES ("Learning SQL Part 3", "Victor", "Education");
INSERT INTO Book VALUES ("How to Save Money", "Victor", "Finance");
INSERT INTO Book VALUES ("The search for faith", "Chandler", "Religion");
INSERT INTO Review VALUES ("Ebert", "Learning SQL", "A");
INSERT INTO Review VALUES ("Ebert", "Learning SQL Part 2", "B");
INSERT INTO Review VALUES ("Hugo", "How to Save Money", "C");
INSERT INTO Review VALUES ("Todd", "How to ace the interview", "A");
INSERT INTO Review VALUES ("Todd", "How to ace the interview 2", "A");
INSERT INTO Review VALUES ("Gary", "The search for faith", "A");
INSERT INTO Review VALUES ("Jim", "Learning SQL", "B");
INSERT INTO Review VALUES ("Jim", "Learning SQL Part 3", "A");
INSERT INTO Reviewer VALUES ("Ebert", "Education");
INSERT INTO Reviewer VALUES ("Hugo", "Finance");
INSERT INTO Reviewer VALUES ("Gary", "Religion");
INSERT INTO Reviewer VALUES ("Jim", "Education");
INSERT INTO Reviewer VALUES ("Ramsey", "Finance");

【问题讨论】:

  • 除了最终的解决方案之外,这些计数查询真的有效吗?您尚未在 select 子句中指定 group by
  • 发生错误,因为您在内部查询中有 group by。您可以使用 join 让生活更轻松,也可以使用exists 子句进行比较。
  • 它们分开工作,但我的问题是如何在一个查询中比较它们。按原样比较时出现错误。
  • 我也尝试了多个 Exists 查询,但也失败了。你能告诉我如何使用 Exists 来解决这个问题吗?
  • 请添加一些示例数据和预期输出

标签: mysql sql database


【解决方案1】:

你可以简单地使用have子句:

select b.title from book b, Review r
where b.title = r.title
group by b.title, b.genre
having count(*) = (select count(*) from reviewer where genre = b.genre);

我将 gerne 添加到分组中,以便能够在子查询中使用它。子查询仅返回该类型的评论者数量。

我应该指出,在您最初的规范中,您还希望包括在其类型中没有评论者的书籍。这可能需要在 having 子句中添加另一个子查询。

另一个注意事项是,尽管不想加入,但您正在加入。您没有使用关键字“join”,但您正在加入 book 和 review(where 子句用于连接条件)。

最后,有点不相关,但使用数字 ID 表示流派和评论者名称可能是个好主意,因为它会使整个事情运行得更快。

【讨论】:

  • FROM 子句中带逗号的答案如何获得支持超出了我的范围。
  • 连接表有两种语法 - 您可以使用 join 关键字,或者您可以从两个表中选择并让 where 子句进行连接。我使用了后者,因为这是问题中的语法,我只想指出使用 having 子句在组计数上添加条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2015-11-04
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多