我正在尝试从SQL数据库中获取一些数据,但是存在一些我不理解的问题。 这是我的查询:
SELECT SUM(t0_.in_budget_hours) AS sclr_0,
SUM(t0_.billable_amount) AS sclr_1,
SUM(t0_.out_budget_hours) AS sclr_2,
SUM(t0_.unprod_hours) AS sclr_3,
SUM(t0_.off_hours) AS sclr_4,
SUM(t0_.duration) AS sclr_5,
SUM(t0_.in_budget_hours) / SUM(t0_.duration) * 100 AS sclr_6,
CONCAT(c1_.name, ' ', c1_.lastname) AS sclr_7,
c1_.alias AS alias_8,
c1_.email AS email_9
FROM collaborator c1_
RIGHT JOIN timesheet t0_ ON (c1_.email = t0_.email)
WHERE t0_.entry_date BETWEEN '2020-01-01 00:00:00' AND '2020-01-22 23:59:59'
GROUP BY sclr_7, c1_.alias, c1_.email
ORDER BY sclr_7 ASC
我从时间表表中获得了很多信息,我想将这些计算与协作者名称合并。
我希望所有协作者都可以加入时间表,即使他们没有时间表(LEFT JOIN)也是如此。如果没有与协作者相关的行,则求和结果应为0,但协作者应出现在结果数据集中。但是目前,如果协作者没有时间表BETWEEN '2020-01-01 00:00:00' AND '2020-01-22 23:59:59'
,他将不会出现在结果中。
我使用此线程What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?尝试了几种类型的联接,但对我没有任何帮助。 有人可以告诉我,即使没有时间表,也要如何让所有协作者参加?
答案 0 :(得分:2)
我希望所有协作者都可以加入时间表,即使他们没有时间表(LEFT JOIN)也是如此。
您的RIGHT JOIN
似乎与此相反。照原样,它将占用entry_date
中的所有行,甚至包括collaborator
中没有匹配记录的行。对于习惯于从左到右阅读的人们来说,RIGHT JOIN
是违反直觉的。
我将改写您的JOIN
为以下LEFT JOIN
:
FROM collaborator c1_
LEFT JOIN timesheet t0_
ON c1_.email = t0_.email
AND t0_.entry_date >= '2020-01-01'
AND t0_.entry_date < '2020-01-23'
旁注:
timesheet
上的条件从WHERE
子句移至ON
的{{1}}部分
我改写了日期过滤器以使用半开间隔,这使我更容易阅读和理解
答案 1 :(得分:0)
您需要进行OUTER
联接才能联接两个表,其中两个表之一中可能没有 匹配行。
默认联接为INNER
,这意味着仅返回匹配的行。
在我看来,LEFT OUTER
应该会给您您想要的东西。
select * from a LEFT OUTER JOIN b
表示a
中的所有行,以及NULL
b
s)