Mysql场景 - 即使没有条目也可以获取所有任务?

时间:2010-01-17 15:48:20

标签: mysql database-design group-by left-join

我有三张桌子

  1. TasksTaskid, Taskname
  2. TaskAllocationsTaskid, EmpNum
  3. TaskEntriesTaskId, EmpNum, WorkedDate, Hoursspent
  4. 现在我希望获得特定周的所有任务条目。在这里我的问题是,即使没有特定任务的Taskentry,我应该至少获得一行TaskId,以及查询结果集中的Hoursspent为Null的Taskname。我一直试图通过以下查询得到这个。

    SELECT A.TaskId, 
           B.TaskName, 
           SUM( C.HoursSpent ) as TotalHours , 
           C.WorkedDate, C.Comments
        FROM TaskAllocations A
        LEFT OUTER JOIN TaskEntries C 
        ON A.TaskId = C.TaskId
        AND A.EmpNum = C.EmpNum
        INNER JOIN Tasks B 
        ON A.TaskId = B.TaskId
        WHERE A.EmpNum =123456
        AND C.WorkedDate
        IN ('2010-01-17','2010-01-18','2010-01-19',
            '2010-01-20','2010-01-21','2010-01-22','2010-01-23' )
        GROUP BY A.TaskId, C.WorkedDate
        ORDER BY A.TaskId,C.WorkedDate ASC ';
    

    我得到的这个SQL文章的内容是,当且仅当有特定任务ID的条目时,那么我才会得到一行。但我想要的是至少为EmpNum可用的每项任务排成一排。即使我为每个TaskId和WorkedDate组合获得一行也没有问题。请帮我解决一下这个。这样做的实际意图是构建一个HTML二维表,其中每个任务条目都针对日期和任务,如下所示。

        ---------------------------------------------------------
        TaskId  TaskName   Sun  Mon  Tue  Wed  Thu  Fri  Sat
        ---------------------------------------------------------
        18      name1       2          3        4:30      3:30
        19      name2                                           
        20      name3       4                             2:30
        22      name4       2:30
        23      name5      
        24      name6       1:30               6                
        ---------------------------------------------------------
    

    这样每个星期每周都可以更新。首先我想到 group_concat ,但由于性能的原因,我使用的是普通的逐个查询组。


    注意:对于特定的taskid和workdate,只有一个小时输入。 我几乎建造了前端。即使没有条目,请帮助我获得如上所述的所有任务ID。我是否需要使用子查询。

2 个答案:

答案 0 :(得分:1)

不要使用内连接,使用左连接或右连接,具体取决于您想要哪些表的值。

这样:

SELECT *
FROM tasks t
LEFT JOIN taskentries te
ON t.id = te.id

与以下内容相同:

SELECT *
FROM tasksentries te
RIGHT JOIN tasks t
ON te.id = t.id
即使没有任务,

也会为您完成所有任务

内连接只会在两个表中都有行时选择行,左连接选择左(第一)表中的所有行并匹配另一行(如果没有这样的行,则null将是所有专栏)。右连接将执行相反的操作:从右(第二)表中选择所有行并从左侧匹配。

a LEFT JOIN bb RIGHT JOIN a

相同

答案 1 :(得分:0)

经过对不同选项的严格测试后,我想出了以下解决方案,该解决方案将为我提供所需的结果。

SELECT Final.TaskId, 
       Final.TaskName, 
       Tmp.HoursSpent AS TotalHours, 
       Tmp.WorkedDate
    FROM (
        SELECT A.TaskId, B.TaskName, A.EmpNum
        FROM TaskAllocations A
                 INNER JOIN 
                 Tasks B 
            ON ( A.TaskId = B.TaskId ) 
        WHERE a.empnum = "333"
        )Final
    LEFT OUTER JOIN (
            SELECT New.TaskId, New.EmpNum, New.WorkedDate, New.HoursSpent
        FROM TaskEntries New
        WHERE New.WorkedDate
        IN 
              ('2010-01-17','2010-01-18','2010-01-19',
              '2010-01-20','2010-01-21','2010-01-22','2010-01-23' )
        OR New.WorkedDate IS NULL 
        AND New.EmpNum = "333"
        )Tmp 
    ON Tmp.TaskId = Final.TaskId
AND Tmp.EmpNum = Final.EmpNum
    ORDER BY Final.TaskId, Tmp.WorkedDate ASC ;

我在问题中的第一个问题是没有工作,因为我在做左外连接时在右表的列上放了一个条件。感谢大家的支持。