【发布时间】:2020-03-05 06:48:18
【问题描述】:
我一直无法理解 INNER JOIN(或任何其他 JOIN 类型),因此我正在努力弄清楚如何在我的特定情况下使用它。事实上,我什至不确定它是否是我需要的。我查看了其他示例并阅读了教程,但我的大脑似乎并没有按照真正获得它所需的方式工作(或者它根本不起作用)。
这是场景:
我有两张桌子 -
- phone_numbers - 此表包含电话号码列表
属于许多不同的客户。单个客户可以拥有
多个号码。为简单起见,我们会说这些字段是
'number_id'、'customer_id'、'phone_number'。
- call_history - 此表记录了其中一个调用的每个调用 第一个表中的数字本来可以的。有记录为 每个人的电话都可以追溯到几年前。再次,为简单起见, 我们会说相关字段是 customer_id、phone_number、 call_start_time。
我想要完成的是在电话号码表中找到属于特定 customer_id 的所有号码,并使用该信息搜索 call_history 表并找到每个电话号码已收到的电话数量,并按每个号码的呼叫次数对其进行分组,最好在一个号码根本没有接到任何呼叫的情况下也显示零。
零调用很重要的原因是因为这是我感兴趣的数据。否则,我可以从 call_history 表中获取所有信息。但我想要实现的是找到没有活动的数字。
我能够完成的只是运行一个查询来获取属于一位客户的所有号码:
SELECT customer_id, phone_number FROM phone_numbers WHERE customer_id = Y;
然后运行第二个查询以获取该 customer_id 在设定持续时间内的所有电话:
SELECT customer_id, phone_number, COUNT(*) FROM call_history WHERE customer_id = Y and call_start_time >= DATE_SUB(SYSDATE(), INTERVAL 30 DAY) GROUP BY phone_number;
然后我不得不使用从两个查询返回的数据,并在 Excel 中使用 VLOOKUP 函数将第二个查询中每个单独号码的呼叫次数与第一个查询中的所有号码列表相匹配,从而留下空白在我的“所有号码”表中,并找出那些在那个时间段内没有来电的号码。
我希望有某种方法可以通过单个查询完成所有这些并返回一个结果表,列出零次调用并消除整个手动 Excel 位,因为它不会过于高效且容易受到人为影响错误。
【问题讨论】:
-
call_start_time 字段的类型是什么?
-
请展示你能做的部分。请给minimal reproducible example。询问 1 个明确的特定非重复问题,重新定位您遇到的第一个问题。请参阅 How to Ask、其他 help center 链接和投票箭头鼠标悬停文本。是时候学习一本关于 SQL 的介绍性教科书了。 PS x inner join y on c 返回粘贴到满足 c 的 y 行的 x 行的每一行。即 x 交叉连接 y 其中 c。那么,您想要 x 交叉连接 y 行中的哪一个?等等。问你第一次卡在哪里。
-
我敢打赌,一旦您了解了所有
JOIN的功能,就很容易实现这一点。
标签: mysql group-by count inner-join