2016-12-16 77 views
1

我正在处理项目, 我需要根据用户每天显示获得的积分和兑换积分。Mysql - 将具有不同日期值的两张表组合在一起

我有两个不同的表来存储数据。 tables(a,b)情况如下: 表:

id user_id  earned created_at 
-------------------------------------------- 
1  1   1  2016-12-14 
2  2   2  2016-12-14 
3  2   1  2016-12-14 
4  3   1  2016-12-15 

表B:

id user_id exchanged created_at 
-------------------------------------------- 
1  1   1  2016-12-14 
2  1   2  2016-12-14 
3  2   1  2016-12-14 
4  4   1  2016-12-15 
5  3   3  2016-12-16 

我想在约会两个表合并如下

user_id  earned exchanged created_at 
------------------------------------------------- 
    1   1   1  2016-12-14 
    2   3   1  2016-12-14 
    3   1   0  2016-12-15 
    4   0   1  2016-12-15 
    3   0   3  2016-12-16 

我已经尝试搜索,我最终以下查询(sqlfiddle):

select user_id, created_at, sum(earned) as earned, sum(exchanged) as exchanged from (
SELECT 
    a.user_id, 
    DATE_FORMAT(a.created_at, '%d-%m-%Y') AS created_at, 
    a.earned, 
    0 AS exchanged 
FROM 
    a 
     LEFT JOIN 
    b ON DATE_FORMAT(a.created_at, '%y%m%d') = DATE_FORMAT(b.created_at, '%y%m%d') 
UNION SELECT 
    b.user_id, 
    DATE_FORMAT(b.created_at, '%d-%m-%Y') AS created_at, 
    0 AS earned, 
    b.exchanged 
FROM 
    a 
     RIGHT JOIN 
    b ON DATE_FORMAT(a.created_at, '%y%m%d') = DATE_FORMAT(b.created_at, '%y%m%d') 
    ) as tbl group by tbl.created_at, tbl.user_id 

但它显示交换点的总和不正确。

+0

你需要按列改变组以“由tbl.user_id组,tbl.created_at” – codemirror

回答

1

尝试...

select user_id, created_at, sum(earned), sum(exchanged) from 
((select id, user_id, earned, 0 as exchanged, created_at from a) 
union all 
(select id, user_id, 0 as earned, exchanged, created_at from b)) combined 
group by user_id, created_at 
0

更新:只有当每个用户每天在两个表中都有条目时,此查询才会提取结果。

select ex.user_id, ex.created_at, sum(earned) as earned, sum(exchanged) as exchanged 
from exchanged ex, earned ea 
where ea.created_at = ex.created_at 
and ea.user_id = ex.user_id 
group by user_id, created_at 
+3

通过加入这两个表丢失其中一个条目,其中一个特定日期的特定用户具有赚取入场券或交换入场券,但不是两者。这就是为什么Ravi引用的查询实现了完整的外连接(通过组合左连接和右连接) –

相关问题