我有三张桌子
Tasks
列Taskid, Taskname
TaskAllocations
列Taskid, EmpNum
TaskEntries
列TaskId, EmpNum, WorkedDate, Hoursspent
现在我希望获得特定周的所有任务条目。在这里我的问题是,即使没有特定任务的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。我是否需要使用子查询。
答案 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 b
与b 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 ;
我在问题中的第一个问题是没有工作,因为我在做左外连接时在右表的列上放了一个条件。感谢大家的支持。