我正在尝试实施this solution。
我有联系人和日历表。联系人具有created_at
时间戳列,日历具有date
列,即日期。
所以查询:
select contacts.id, calendar.date
from contacts
right join calendar on date(contacts.created_at) = calendar.date
永远不会结束。
我读过date(contacts.created_at)
会减慢它,其中一个可能的解决方案是将created_at
列分为两列:date
和time
。但我不喜欢这个解决方案,因为我需要timestamp列。还有其他方法来处理这种情况吗?
基本上这是一个着名的问题,当你得到一些日期的统计数据,你需要用零填充日期空白。所以也许值得尝试在PHP中处理这个......
答案 0 :(得分:2)
您可以使用生成的列存储created_at
列的日期组件:
ALTER TABLE contacts
ADD created_at_date AS (date(created_at)) STORED;
然后您可以像往常一样在此列上JOIN
。
请注意,MySQL 5.7.5及更高版本中提供了生成的列。
答案 1 :(得分:0)
我猜你在created_at
上有索引,但是当你使用date()
优化器时,不能使用该索引,因为它是一个不同的字段。
因此,如果您在联系人上创建日期列而不是索引
,那就更好了或者试着尝试:
select contacts.id, calendar.date
from contacts
right join calendar
on contacts.created_at >= calendar.date
and contacts.created_at < DATE(DATE_ADD(calendar.date, INTERVAL -1 DAY))