首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取一对多连接中的空记录计数

如何获取一对多连接中的空记录计数
EN

Stack Overflow用户
提问于 2019-08-28 14:50:37
回答 2查看 61关注 0票数 0

我有一个accountplan表,在该表中,用户的帐户在给定时间可以没有关联的计划,也可以关联单个/多个计划或非活动计划。

account表:

代码语言:javascript
复制
+---------+-------------+---+
|   ID    | account_id  | ..|
+---------+-------------+---+
|   1     |   111111    |   |
|   2     |   222222    |   |
|   3     |   333333    |   |
|   4     |   444444    |   |
+---------+-------------+---+

plan表:

代码语言:javascript
复制
+----+--------------------+----------------+-----------------+---------------------+---------------------+
| id |     account_id     | attribute_key  | attribute_value | start_date          | end_date            |
+----+--------------------+----------------+-----------------+---------------------+---------------------+
|  1 |             111111 |      RPC       | AB              | 2011-10-01 00:00:00 | NULL                |
|  2 |             111111 |      RPC       | CND             | 2011-10-01 00:00:00 | NULL                |
|  3 |             222222 |      RPC       | IA              | 2011-10-01 00:00:00 | 2015-04-01 00:00:00 |
|  4 |             222222 |      RPC       | CND             | 2011-10-01 00:00:00 | 2015-04-01 00:00:00 |
|  5 |             333333 |      RPC       | IA              | 2011-10-01 00:00:00 | 2015-04-01 00:00:00 |
|  6 |             333333 |      RPC       | CND             | 2011-10-01 00:00:00 | NULL                |
+----+--------------------+----------------+-----------------+---------------------+---------------------+

如果end_dateNULL,则认为关联的计划处于活动状态。我试图拿出一个查询,将返回列表或帐户计数,其中只有inactive计划相关联。根据上面的情况,它应该是222222,因为它有两个关联的计划,但这两个计划都标记为非活动。

代码语言:javascript
复制
+----+--------------------+----------------+-----------------+---------------------+---------------------+
| id |     account_id     | attribute_key  | attribute_value | start_date          | end_date            |
+----+--------------------+----------------+-----------------+---------------------+---------------------+
|  3 |             222222 |      RPC       | IA              | 2011-10-01 00:00:00 | 2015-04-01 00:00:00 |
|  4 |             222222 |      RPC       | CND             | 2011-10-01 00:00:00 | 2015-04-01 00:00:00 |
+----+--------------------+----------------+-----------------+---------------------+---------------------+
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-28 15:03:20

在派生表(子查询)中,您可以获得只有“非活动计划”的account_id值的列表:

代码语言:javascript
复制
SELECT account_id 
FROM plan 
GROUP BY account_id 
HAVING COUNT(end_date IS NULL) = 0 /* No plan with null end date */

现在,您可以使用此子查询连接回plan表,以获取该account_id的所有计划

代码语言:javascript
复制
SELECT p.* 
FROM plan AS p 
JOIN (
       SELECT account_id 
       FROM plan 
       GROUP BY account_id 
       HAVING COUNT(end_date IS NULL) = 0
     ) AS dt ON dt.account_id = p.account_id 
票数 1
EN

Stack Overflow用户

发布于 2019-08-28 15:16:52

我觉得还可以。

代码语言:javascript
复制
SELECT
    p.*
FROM
    Plan
INNER JOIN Account a USING (account_id)
WHERE p.account_id NOT IN (
    SELECT p2.account_id FROM Plan p2 WHERE p2.end_date IS NULL
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57686491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档