SQL 计数依赖于不同 table 中的列的列行数

SQL count column rows that is dependent on a column in different table when group by

我一直在努力完成以下作业:

Write a query that returns authors who've written books in more than one category and whose books are published by at least two different publishers. Display the author's Last Name and First Name, the Titles of Books they've written and the Book type. Sort the output by the author's last name.

这些是涉及的表格:

AUTHORS (Au_id, Au_lname, Au_fname, Phone, Address, City, State, Country, Postalcode) 
PUBLISHERS (Pub_id, Pub_name, City, State) 
TITLES (Title_id, Title, Type, Pub_id, Price, Advance, Total_sales, Notes, Pubdate, Contract) 
TITLEAUTHOR (Au_id, Title_id) 

我能够确定我需要的列,但不确定如何实施过滤器(2 位不同的作者,2 种不同的类型)。我假设我需要按作者 ID 分组并计算 Pub_id 和类型列。

这是我到目前为止写的:

SELECT AUTHORS.Au_lname, AUTHORS.Au_fname, TITLE.Title_id, TITLE.Type
from AUTHORS
JOIN TITLEAUTHOR ON AUTHORS.Au_id = TITLEAUTHOR.Au_id
JOIN TITLE ON TITLEAUTHOR.Title_i = TITLE.Title_i 
group by AUTHORS.Au_lname, AUTHORS.Au_fname, TITLE.Title_id, TITLE.Type
ORDER BY AUTHORS.Au_lname;

Tomasz,欢迎来到 Stack Overflow!恭喜你获得第一个 post。您已经做了一些出色的事情:

  • 您包含了架构的详细信息
  • 您提供了清晰的问题陈述
  • 您提供了一个您已经尝试过的 SQL 示例。

有几种方法可以改善您的 post,这将有助于您获得良好答案的机会,同时还能提高您参与社区的能力:

  • 格式化时要格外小心 - 您的第二次编辑引入了一些冗余文本。
  • 对您的代码要特别注意 - 您提供的第一组有一些不正确的列名称,这可能会导致某些用户查看您的 post 然后忽略它。在您第一个 post 问题出现在列表顶部附近时,有一个关键的 window;这是你获得答案的最佳机会,所以在你的演讲中非常小心是值得的。 Here's a link 到一些关于如何提问的好书。
  • 当你在做作业时要坦诚相告!可以想象,这个社区收到了很多家庭作业帮助请求。许多普通用户对 'cheat' 通过在线 post 完成作业的人感到沮丧。不过,有一些方法可以获得帮助:仔细阅读 this post 以便为下一个问题做好准备。关键是要表明你已经尝试过自己解决它,具体说明什么不起作用,并清楚这是家庭作业的事实。

现在,关于你的问题!您正在寻找的是 HAVING 子句,它允许您将查询过滤为 return 仅满足聚合级别条件的组成员。您对 COUNT 的直觉是正确的,并且 HAVING 子句会让您这样做。这是一个例子:

SELECT Au_id
FROM 
    AUTHORS 
     INNER JOIN 
    TITLEAUTHOR ON 
        AUTHORS.Au_id = TITLEAUTHOR.Au_id 
     INNER JOIN 
    TITLES ON 
        TITLEAUTHOR.Title_id = TITLE.Title_id
GROUP BY Au_id 
HAVING 
    COUNT(DISTINCT TITLES.pub_id) > 1 AND 
    COUNT(DISTINCT TITLES.Type) > 1

请注意,这会在 COUNT() 函数中添加单词 DISTINCT - 这有助于您满足 "two different publishers" 要求。

一旦您了解了如何使用 HAVING,您就可以编写一个查询来获取您的作业要求的列,并将该集合过滤为您想要的 return 作者:基本查询结构将如下所示:

SELECT MyColumns
FROM MyTables 
WHERE Au_id IN 
  (
    SELECT Au_id
    FROM 
        AUTHORS 
         INNER JOIN 
        TITLEAUTHOR ON 
            AUTHORS.Au_id = TITLEAUTHOR.Au_id 
         INNER JOIN 
        TITLES ON 
            TITLEAUTHOR.Title_id = TITLE.Title_id
    GROUP BY Au_id 
    HAVING 
        COUNT(DISTINCT TITLES.pub_id) > 1 AND 
        COUNT(DISTINCT TITLES.Type) > 1
  )
ORDER BY WhateverYouWant

祝你好运,欢迎来到SQL!