MySQL多表查询数据出现串行

Posted Brush

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL多表查询数据出现串行相关的知识,希望对你有一定的参考价值。

 

如上图所示,要查询一个用户(从注册开始) 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;

以上是关于MySQL多表查询数据出现串行的主要内容,如果未能解决你的问题,请参考以下文章

mysql 数据操作 多表查询 目录

MySQL-04-笔记

MySQL数据库多表查询

MySQL数据库多表查询

MySQL 如何多表查询

mysql多表查询并创建视图