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 框架)