MySQL - 使用 COUNT 在同一个表上进行完全外连接

Posted

技术标签:

【中文标题】MySQL - 使用 COUNT 在同一个表上进行完全外连接【英文标题】:MySQL - Full outer join on same table using COUNT 【发布时间】:2014-07-18 07:49:15 【问题描述】:

我正在尝试生成以下格式的表格。

Proday | 2014-04-01 | 2014-03-01
--------------------------------
  1    |      12    |     17
  2    |       6    |      0
  7    |       0    |     24
 13    |       3    |      7

Prodays(两个时间戳之间的持续时间)是一个计算值,月份的数据是一个 COUNT。我可以输出一个月的数据,但是在将查询连接到其他月份时遇到了麻烦。每个月的索引(prodays)可能不匹配。例如,2014-04-01 可能没有 Prodays 7 的任何数据,而 2014-03-01 可能没有 Proday 2。应该用 0 或 null 表示。

我怀疑 FULL OUTER JOIN 应该可以解决问题。但是读过这在 mysql 中是不可能的吗?

这是获取单月数据的查询:

SELECT round((protime - createtime) / 86400) AS prodays, COUNT(id) AS '2014-04-01'
FROM  `tbl_users` as t1
WHERE status = 1 AND DATE_FORMAT(FROM_UNIXTIME(createtime),'%Y-%m-%d') >= '2014-04-01'
AND DATE_FORMAT(FROM_UNIXTIME(createtime),'%Y-%m-%d') <= LAST_DAY('2014-04-01')
GROUP BY prodays
ORDER BY `prodays` ASC

如何加入/联合其他查询以创建 2014-03-01 列?

【问题讨论】:

你的源表是什么? 【参考方案1】:

您想使用条件聚合——即将过滤逻辑从where 子句移至select 子句:

SELECT round((protime - createtime) / 86400) AS prodays,
       sum(DATE_FORMAT(FROM_UNIXTIME(createtime),'%Y-%m-%d') >= '2014-04-01' AND 
           DATE_FORMAT(FROM_UNIXTIME(createtime),'%Y-%m-%d') <= LAST_DAY('2014-04-01')
          ) as `2014-04-01`,
       sum(DATE_FORMAT(FROM_UNIXTIME(createtime),'%Y-%m-%d') >= '2014-03-01' AND 
           DATE_FORMAT(FROM_UNIXTIME(createtime),'%Y-%m-%d') <= LAST_DAY('2014-03-01')
          ) as `2014-03-01`
FROM  `tbl_users` as t1
WHERE status = 1
GROUP BY prodays
ORDER BY `prodays` ASC;

【讨论】:

谢谢戈登。不错的技术。

以上是关于MySQL - 使用 COUNT 在同一个表上进行完全外连接的主要内容,如果未能解决你的问题,请参考以下文章

在多个表上进行条件 mysql 连接的最有效方法? (Yii php 框架)

带有子查询的 CTE 查询在小型索引表上很慢;如何在 MySQL 上进行优化?

MySQL知识点

MySQL-视图上进行增删改查

MySQL:在具有多个外键依赖项的表上进行更新

mysql获取表中数据行数