无论数据如何,都为表中的每个日期选择一行

时间:2015-04-12 13:07:38

标签: mysql sql

我的数据库中有以下3个表:

菜鸟

  • ID
  • 名称
  • img_url
  • associations_id

noobs_has_points

  • noobs_id
  • points_id

  • ID
  • 金额
  • create_time(作为UNIX时间戳)

我想每天都得到一个结果(例如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

1 个答案:

答案 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

交叉连接为每个菜鸟提供指定范围内每个日期的结果,而左连接则确保零菜单没有任何点数。