MySQL如何离开联接

时间:2020-01-22 12:57:34

标签: mysql sql left-join

我正在尝试从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?尝试了几种类型的联接,但对我没有任何帮助。 有人可以告诉我,即使没有时间表,也要如何让所有协作者参加?

2 个答案:

答案 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)

More details here