我有一个基于日历的应用程序,其中练习记录在“会话”表中。 记录仅在进行锻炼时存储在表格中,因此休息日有间隙。
虽然这是基于日期的,但我将这一天存储为整数偏移量 - Unix时间戳样式,但在这种情况下是自1970年1月1日以来的天数。
用户可以将日期范围视为日历,我想显示延伸到此日期范围内的任何条纹的长度。在绘制日历时会重复记录,以便生成部分条纹。我需要做的是添加在当前日历视图之前开始并延伸到其中的条纹长度(如果有的话)。
我有一个基于此的工作解决方案:
SELECT MIN(a.DayOffset) AS Start, MIN(c.DayOffset) AS End
FROM Sessions AS a
LEFT JOIN Sessions AS b ON a.DayOffset = b.DayOffset + 1 AND b.SessionType = 'running'
LEFT JOIN Sessions AS c ON a.DayOffset <= c.DayOffset AND c.SessionType = 'running'
LEFT JOIN Sessions AS d ON c.DayOffset = d.DayOffset - 1 AND d.SessionType = 'running'
WHERE
a.SessionType = 'running'
AND b.SessionType IS NULL
AND c.SessionType IS NOT NULL
AND d.SessionType IS NULL
And a.SessionDate<='".$ts."'
GROUP BY a.DayOffset ORDER BY End DESC LIMIT 1
DayOffset是表示日期的整数; $ ts保存日历视图开头的unix时间戳 - 我本可以再次使用DayOffset - 不知道为什么我没有!
这会计算所有条纹的长度,从最近结束时对它们进行排序并选择最上面的条纹。
它工作得很好但是Left将表连接到自身3次并产生许多未使用的结果。
因此问题是,任何人都可以建议任何可以更有效地产生正确结果的方法吗?