如上图所示,要查询一个用户(从注册开始) 7天, 15天, 30天的发帖数量, 查询出来的数据结果串行了。因为,有注册的用户,他前7天没有发帖,即发帖数为0,在数据表中应该显示为NULL的,所以数据表中15天多出来的数据,是用户7天发帖数为0的。 30天的也同样道理。
怎么解决呢? 首先以 最大限期时30天的为主参照表, 30天包含15天,7天,如果以他为参考主表,筛选出来的用户ID肯定会也有15天,7天的,如果没发帖的话,查询显示就是NULL。
语句这样写, .
select * from (连表查询产生的虚拟表30天的) left join (联表查询产生的虚拟表7天的) on 这两张虚拟表的连接条件
select * from (连表查询产生的虚拟表30天的) left join (联表查询产生的虚拟表15天的) on 这两张虚拟表连接条件
SELECT
A.id, A.user_id, A.`注册时间`, A.`发帖数量`, B.`发帖数量`
FROM
(
SELECT
qp.id,
qp.user_id,
qs.wechat,
from_unixtime(qp.create_at, '%Y-%m-%d') 注册时间,
COUNT(qp.user_id) 发帖数量,
count(qs.id) 二手数量,
qs.create_at ,
uw.create_at AS uwcreate
FROM
welife_quan.quan_post AS qp
LEFT JOIN quan_post_second AS qs ON qs.pid = qp.id
LEFT JOIN welife_system.user_wechat AS uw ON uw.unionid = qp.user_id
GROUP BY
qp.user_id
HAVING
qs.wechat != ''
AND qs.create_at <= uwcreate + 60 * 60 * 24 * 30
ORDER BY
qp.id DESC
) AS A
LEFT JOIN(
SELECT
qp.id,
qp.user_id,
qs.wechat,
from_unixtime(qp.create_at,'%Y-%m-%d') 注册时间,
COUNT(qp.user_id) 发帖数量,
count(qs.id) 二手数量,
qs.create_at,
uw.create_at AS uwcreate
FROM
welife_quan.quan_post AS qp
LEFT JOIN quan_post_second AS qs ON qs.pid = qp.id
LEFT JOIN welife_system.user_wechat AS uw ON uw.unionid = qp.user_id
GROUP BY
qp.user_id
HAVING
qs.wechat != ''
AND qs.create_at <= uwcreate + 60 * 60 * 24 * 7
ORDER BY
qp.id DESC
) AS B ON A.user_id = B.user_id;