这可能很简单,但我想知道编写这个查询的“最佳”或“标准”方式。
我有两张桌子。一种是具有任务名称、开始时间戳和结束时间戳的工作计划。此表由计划管理器提前填充。
UserId | task | startTime | endTime
joe | dishes | 2010-05-15 10:00 | 2010-05-15 14:00
joe | papers | 2010-05-15 14:00 | 2010-05-15 15:00
joe | trash | 2010-05-16 09:00 | 2010-05-16 10:00
joe |cooking | 2010-05-16 11:30 | 2010-05-16 13:30
第二个表是一个包含每天工作分钟数和日期戳的工作日志。此表由员工填充。
UserId | date | timeLogged
joe | 2010-05-15 | 300
joe | 2010-05-16 | 180
workLog
我想要的是一个一次完成两个任务的查询。问题是它应该只在“first”为null的情况下执行“second”查询,因此执行任何联接或如果nulls对我来说是不正确的,因为当
工作日志
以表为准。例如,如果用户在星期二和星期三生病,但是记录了星期一和星期四的小时数,我不希望结果使用星期一和星期四的记录时间以及星期二和星期三的预定时间。但是,如果他那周每天都生病,那么可以用调度表数据填充表单,因为用户不会(或者至少不应该)提交表单。
我可以想出一两种方法,主要使用第三个聚合查询和
UNION
声明,但这似乎有些草率。
更新
SELECT date, timeLogged
FROM workLog
WHERE userID = '$userid'
AND date BETWEEN $startDate AND $endDate
如果没有返回结果:
SELECT DATE(startTime) AS date,
SUM(TIME_TO_SEC(TIMEDIFF(startTime,endTime)))/60 AS timeLogged
FROM schedule
WHERE userID = '$userid'
AND date BETWEEN $startDate AND $endDate
GROUP BY DATE(startTime)
因此,两个查询之后的任何函数都不需要知道结果来自哪个表。