mysql - 如何获取一对多连接中 NULL 记录的数量

标签 mysql join group-by null

我有一个帐户计划表,其中用户的帐户在给定时间可以没有与其关联的单个/多个或非事件计划。

帐户表:

+---------+-------------+---+
|   ID    | account_id  | ..|
+---------+-------------+---+
|   1     |   111111    |   |
|   2     |   222222    |   |
|   3     |   333333    |   |
|   4     |   444444    |   |
+---------+-------------+---+

计划表:

+----+--------------------+----------------+-----------------+---------------------+---------------------+
| 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,则关联计划被视为有效。 我正在尝试提出一个查询,该查询将返回仅与非事件计划关联的帐户列表或计数。根据上面的内容,它将是 222222,因为它有两个与之关联的计划,但都被标记为非事件状态。:

+----+--------------------+----------------+-----------------+---------------------+---------------------+
| 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 |
+----+--------------------+----------------+-----------------+---------------------+---------------------+

最佳答案

在派生表(子查询)中,您可以获得仅包含“非事件计划”的 account_id 值列表:

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 的所有计划:

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 

关于mysql - 如何获取一对多连接中 NULL 记录的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57686491/

相关文章:

mysql - 如何将我的 MySQL 数据库转移到另一台计算机?

mysql - 如何分别用他们的名字替换逗号分隔的部门 ID?

group-by - Mysql 加速 max() group by

Mysql 仅在 2 个字段上使用 DISTINCT

php - mysql_fetch_array

php - 插入表时不能使用符号(php/sql)

mysql - 获取基于条件的选择查询

php - 表 1 中的标志字段也适用于表 2

sql - 如何使用这种不寻常的匹配条件编写连接?

mysql - Rails+ActiveRecords : How to group records by date and show their count based on a condition?