我有以下数据库表:
用户表:
| id | name |
| 1 | bob |
| 2 | jane |
| 3 | tim |
| 4 | rex |
事件表:
| id | user_id | date |
| 1 | 1 | 12/05/2018 |
| 2 | 1 | 13/05/2018 |
| 2 | 2 | 15/05/2018 |
| 3 | 2 | 16/05/2018 |
| 4 | 3 | 27/05/2018 |
我想构造一个sql查询,它检索在接下来的7天内发生任何事件的所有用户,并且还返回一个列,其中列出了用户在这7天内预订了多少事件。
理想情况下,这就是我想要实现的目标:
| user_id | 12/05/2018 | 13/11/2018 | 14/11/2018 | 15/11/2018 |
| 1 | 1 | 1 | 0 | 0 |
| 2 | 0 | 0 | 0 | 1 |
到目前为止,我已经将此作为一个起点,但它不起作用,因为它返回零行:
SELECT
users.id,
name
FROM
`users`
inner join bookings on `users`.`id` = bookings.teacher_id
WHERE
bookings.`date` BETWEEN NOW() AND DATE_ADD( NOW(), INTERVAL 7 DAY )
有人能帮我完成吗?这在1sql查询中可能吗?
2条答案
按热度按时间hgc7kmma1#
如果不进行硬编码,很难将列名生成为下一个日期的字符串(如“2018-11-01”、“2018-11-02”)。
但我可以给出一个答案,列名称是
d1..d7
. 希望你的情况可以。这可能不是最佳的解决方案,但它是有效的。对于您给定的表,这个查询会给出这样的结果。
在这里
d1
意思是,第二天。d2
指后天等。此外,此解决方案还提供了一个包含所有零的列(即没有任何事件的天数)
nbysray52#
实际上这里你需要左连接
这是因为您希望表“user”中的元素在表booking中没有链接。
使用left join将返回表user中的所有元素,不管它是否有预订,然后使用where条件筛选并只保留那些没有预订的元素(booking.id为null)
在sql中,约定表名为单数。。。在nosql中,它是另一种方式,只是混淆一切。。。