【问题标题】:How to join the count(*) from another table如何从另一个表加入计数(*)
【发布时间】:2020-07-09 01:31:45
【问题描述】:

我在这里有一个问题,如何将 count(*) 从另一个表连接到基础表。

问题如下:

表:客户

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| customer_id | int     |
| product_key | int     |
+-------------+---------+

product_key 是 Product 表的外键。

表格:产品

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| product_key | int     |
+-------------+---------+

product_key 是该表的主键列。

为报告编写 SQL 查询,该报告提供客户表中购买了 Product 表中所有产品的客户 ID。

例如:

客户表:

+-------------+-------------+
| customer_id | product_key |
+-------------+-------------+
| 1           | 5           |
| 2           | 6           |
| 3           | 5           |
| 3           | 6           |
| 1           | 6           |
+-------------+-------------+

产品表:

+-------------+
| product_key |
+-------------+
| 5           |
| 6           |
+-------------+

结果表:

+-------------+
| customer_id |
+-------------+
| 1           |
| 3           |
+-------------+

购买了所有产品(5 和 6)的客户是 id 为 1 和 3 的客户。

我的做法是:

select distinct 
c.customer_id 
from customer as c join (
    select 
    count(distinct product_key) as total 
    from product 
) as t 
group by c.customer_id 
having count(distinct c.product_key) = t.total

但是我会遇到如下错误信息:

Unknown column 't.total' in 'having clause'

你介意找出我哪里做错了吗?感谢您的帮助。

【问题讨论】:

  • 我不确定您是否可以在 HAVING 子句中引用子选择中的列。 “SQL 标准要求 HAVING 必须仅引用 GROUP BY 子句中的列或聚合函数中使用的列。但是,MySQL 支持对此行为的扩展,并允许 HAVING 引用 SELECT 列表中的列和外部子查询中的列作为好吧。”
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 包括 DBMS 版本。
  • 请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com & 标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 谢谢你,@tadman。我想知道我是否在我的代码中引用了外部子查询?我使用外连接连接原始表和汇总计数表。

标签: mysql sql join count


【解决方案1】:

您不需要HAVING 子句。您正在尝试在 SQL 中加入笛卡尔连接。我怀疑聚合适用于笛卡尔积。

下面的 SQL 将返回拥有所有产品的客户列表 -

select customer_id from (select customer_id, count(distinct p.product_key) product_count
from customer c 
join product p on c.product_key = p.product_key
group by c.customer_id) t
where t.product_count = (select count(distinct product_key) from product);

【讨论】:

  • 谢谢,山塔努。这就是我的观点。我想知道为什么聚合在连接函数中不能很好地工作。
  • 很高兴为您提供帮助!请接受它作为答案并投票,以便对遇到类似聚合问题的其他人有所帮助。
猜你喜欢
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 2019-08-15
  • 2020-04-15
  • 2019-05-24
相关资源
最近更新 更多