MySQL右外连接查询

时间:2014-12-03 10:14:27

标签: mysql sql outer-join

我有一个关于MySQL查询的查询。

我有2个表,其中包含SalesRep详细信息,如姓名,电子邮件等。我有另一个表,其中包含salesDate,客户服务以及通过外键链接到salesrep的销售数据。需要注意的一点是,报告日期总是星期五。

所以要求是这样的:我需要为给定的销售代表列表找到13周的销售数据 - 如果在特定的星期五没有数据,则为0。查询结果由Java应用程序使用,该应用程序依赖于每个销售代表的13行数据。

我创建了一个表,其中填充了所有星期五日期,并编写了如下所示的外部联接:

select * from (
         select name, customersServed, reportDate 
         from Sales_Data salesData
         join `SALES_REPRESENTATIVE` salesRep on salesRep.`employeeId` = salesData.`employeeId`
         where employeeId = 1   
    ) as result 
    right outer join fridays on fridays.datefield = reportDate
    where fridays.datefield between '2014-10-01' and '2014-12-31'
   order by datefield

enter image description here

现在我怀疑:

  • 有什么办法可以让我在上面的查询中为所有13行填充名称?

  • 如果有2个销售代表,我想使用IN子句,预计总共26行 - 每个销售人员13行(即使没有该人的记录,我&#39 ; d仍然希望看到13行空值),以及3个销售代表的39行

这些可以在MySql中完成吗?如果可以,有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

您必须首先选择您的行(没有customersServed),然后为customerServed创建外部联接

类似的东西:

select records.name, records.datefield, IFNULL(salesRep.customersServed,0)
from (
         select employeeId, name, datefield 
         from `SALES_REPRESENTATIVE`, fridays
         where fridays.datefield between '2014-10-01' and '2014-12-31'
         and employeeId in (...)
    ) as records 
    left outer join `Sales_Data` salesData on (salesData.employeeId = records.employeeId and salesData.reportDate = records.datefield)
   order by records.name, records.datefield

答案 1 :(得分:0)

您必须进行2级嵌套,在嵌套查询中更改为salesrep的外部联接,因此每个代表至少有1条记录,然后是没有任何条件的星期五加入至少13条记录每个rep,然后是最终右外连接条件(fridays.datefield = innerfriday.datefield和(reportDate为null或reportDate = innerfriday.datefield))

非常低效,尝试在代码中执行此操作,除非是非常小的数据。