我的数据库中有以下3个表:
我想每天都得到一个结果(例如FROM_UNIXTIME(points.create_time,'%Y-%m-%d')
)。在那个结果中,我想要noobs.id和他的点数,所以SUM(points.amount)。那么一个菜鸟当天是否真的得分,并不重要,如果他不这样做,我会想要一个0的那一行作为数量,这样每天我都能看到每个菜鸟得分多少分
但是,我不知道如何得到这个结果。我尝试了左/右(或联合)连接的一些东西,但我没有得到我想要的结果。任何人都可以帮我这个吗?
示例结果:
day | points.amount | noobs.id
2015-04-11 | 3 | 1
2015-04-11 | 0 | 2 (no points scored, no entry in database)
2015-04-12 | 0 | 1 (no points scored, no entry in database)
2015-04-12 | 1 | 2
来自三个表的一些样本数据:
菜鸟
id | name | img_url | associations_id
1 | Rien | NULL | 1
2 | Peter| NULL | 1
noobs_has_points
noobs_id | points_id
1 | 1
2 | 3
分
id | amount | create_time
1 | 3 | 1428779292
2 | 1 | 1428805351
答案 0 :(得分:1)
因为给定的菜鸟在某一天可能没有dara,所以你需要一种方法来生成日期值。不幸的是,mysql没有内置的方法来做到这一点。如果联合作为子查询,您可以使用系列编码查询范围,但它很丑陋且不可扩展。
我建议创建一个表来保存日期值:
create table dates(_date date not null primary key);
并填充大量日期(比如1970年至2020年的所有内容)。
然后你可以编码:
select _date day, sum(p.amount) total, n.id
from dates d
cross join noobs n
left join noobs_has_points np on np.noob_id = n.id
left join points p on p.id = np.points_id
and date(p.create_time) = _date
where _date between ? and ?
group by 1, 3
交叉连接为每个菜鸟提供指定范围内每个日期的结果,而左连接则确保零菜单没有任何点数。