代码之家  ›  专栏  ›  技术社区  ›  Anthony

在MySQL中组合“no results”第二个查询和第一个查询

  •  2
  • Anthony  · 技术社区  · 14 年前

    这可能很简单,但我想知道编写这个查询的“最佳”或“标准”方式。

    我有两张桌子。一种是具有任务名称、开始时间戳和结束时间戳的工作计划。此表由计划管理器提前填充。

    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)
    

    因此,两个查询之后的任何函数都不需要知道结果来自哪个表。

    1 回复  |  直到 4 年前
        1
  •  2
  •   Álvaro González    14 年前

    这些查询返回不同的结果。如果按用户和日期将它们连接起来,然后为worklog获取重复行,则只能将它们组合成一个句子:

    SELECT ws.UserId, ws.task, ws.startTime, ws.endTime, wl.timeLogged
    FROM workSchedule ws
    LEFT JOIN workLog wl ON ws.UserId=wl.UserId
        AND DATE(ws.startTime)=wl.date
    WHERE UserId='joe'
    

    会返回:

    UserId |   task |        startTime |          endTime | timeLogged
       joe | dishes | 2010-05-15 10:00 | 2010-05-15 14:00 |        300
       joe | papers | 2010-05-15 14:00 | 2010-05-15 15:00 |        300
       joe |  trash | 2010-05-16 09:00 | 2010-05-16 10:00 |        180
       joe |cooking | 2010-05-16 11:30 | 2010-05-16 13:30 |        180
       joe | dishes | 2010-05-17 09:00 | 2010-05-17 13:30 |       NULL
       joe | papers | 2010-05-17 13:30 | 2010-05-17 15:00 |       NULL
    

    ... 只考虑到开始的时间。(你能有一个像 2010-05-17 23:30 — 2010-05-18 00:30 ?)

    老实说,我觉得没道理。我会把它们分开。