mySQL如何左键连接

mySQL如何左键连接,mysql,sql,left-join,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

我试图从我的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
我有很多从时间表表计算出来的信息,我想把这些计算和合作者的名字合并起来

我希望有所有的合作者,并加入他们的时间表,即使他们没有任何时间表离开加入。如果没有与协作者相关的行,则总和结果应为0,但协作者应出现在结果数据集中。但目前,如果合作者在“2020-01-01 00:00:00”和“2020-01-22 23:59:59”之间没有任何时间表,他将不会出现在结果中

我尝试了几种类型的连接使用这个线程,但没有为我工作。 有人能告诉我,即使没有时间表,如何让所有collaborator都参与进来吗?

您需要一个外部联接来联接两个表,其中一个表中可能没有任何匹配的行

默认情况下,联接是内部的,这意味着只返回匹配的行

在我看来,一个左撇子应该给你你想要的

select*from a LEFT OUTER JOIN b表示a中的所有行,以及b中匹配的行或空值

我希望有所有的合作者,并加入他们的时间表,即使他们没有任何时间表离开加入

您的右连接似乎与此相反。事实上,它将接受entry_date中的所有行,甚至是collaborator中没有匹配记录的行。对于习惯于从左到右阅读的人来说,右连接是非常反直觉的

我会将您的连接重写为以下左连接:

旁注:

时间表上的条件需要从WHERE子句移动到JOIN的on部分

我重写了日期过滤器,以使用半开间隔,我发现这更便于阅读和理解


如果a0.entry日期介于“2020-01-01 00:00:00”和“2020-01-22 23:59:59”之间或a0.entry日期为空,则可以工作您的a0表是什么?如果a0.entry_date介于“2020-01-01 00:00:00”和“2020-01-22 23:59:59”之间,或者a0.entry_date为空,则似乎未在代码段中声明,但对于该命题,不起作用,但为ty。a0_uu是t0_u,很抱歉我已经纠正了这些错误。您通常按照与所选相同的列进行分组,除了那些设置函数的参数。我对分组方式没有任何问题,因此这与我的联接问题有关吗?选择SUMt0_u。in_budget_uHours作为sclr_0,SUMt0_u。billable_uAmount作为sclr_u1,SUMt0_u。out_uBudget_uHours作为sclr_2,SUMt0.unprod_时数为sclr_3,SUMt0.off_时数为sclr_4,SUMt0.duration为sclr_5,SUMt0.in_预算时数/SUMt0.duration*100为sclr_6,CONCATc1_.name',c1_.lastname为sclr_7,c1_.alias为别名,合作者c1_uu.email作为电子邮件发送至c1_uu.email=t0_u.email上的c1_uu左侧外部连接时间表t0_u.email,其中t0_u.entry_u日期介于“2020-01-01 00:00:00”和“2020-01-22 23:59:59”之间,由sclr_u7分组,c1_u.别名,c1_u.sclr_u7 ASC发送的电子邮件订单无效,如果我没有弄错,左连接与mysqlI的左外部连接相同,我非常确定MySQL上的默认连接&大多数RDBMS是内部连接。我在MySQL文档中找不到对它的引用,但它是,谢谢,但这不起作用。我试过先左后右。我还试图从时间表更改collaborator中的源表,但没有工作。@Shining:注意,我还将条件从WHERE子句移动到了左侧联接的ON部分,您已经尝试过了吗?请对您的真实数据进行一次尝试。在我最初的sql请求中,我有与您相同的子句。我不太明白你改变了什么,对我来说,你只改变了右连接到左连接,其他什么都没有。中间条款与您的日期相同filter@Shining:仔细看。输入日期的过滤器位于WHERE子句中,其中t0输入日期介于“2020-01-01 00:00:00”和“2020-01-22 23:59:59”之间。我更改了它,使其位于左JOIN的ON子句中。所以基本上我的查询根本没有WHERE子句。你是最好的!这是我的错!非常感谢。你有一些文件可以更准确地解释我的错误吗?我的意思是a中的ON和WHERE子句之间的区别?再次感谢你,伙计!
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'