2014-12-03 58 views
0

我有一个关于MySQL中的查询的查询。MySQL的右外联接查询

我通过外键包含SalesRep的详细信息,如姓名,电子邮件等我与它有reportDate销售数据的另一个表,客户服务和链接指向SalesRep 2个表之一。有一点需要注意的是reportDate总是一个星期五。

所以要求是这样的:我需要找到一个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行的填充名称?

  • 如果有两个销售代表,我想使用一个IN子句,总共有26行 - 每个销售人员13行(即使没有该人的记录,我仍然希望见第13行空的),和39 3个的销售代表

难道这MySql中完成,并且如果是这样,任何人都可以点我在正确的方向?

+0

你试过从查询中删除此:'其中雇员= 1'?或者这样做:'where employeeId IN(1,2)'? – 2014-12-03 10:32:42

+0

试过,但有一个正确的外连接,我不会得到26行(每个销售代表一个)。上面发布的查询只是为了获得所有13个星期五的一个用户的名字和0。 – prabugp 2014-12-03 10:38:41

+0

如果你喜欢,可以考虑下列行为这个简单的两步过程:1.如果您还没有这样做,提供适当的DDL(和/或sqlfiddle),这样我们可以更容易复制的问题。 2.如果您还没有这样做,提供与在步骤1提供 – Strawberry 2014-12-03 11:02:17

回答

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 
+0

我知道这是10天后..但我把你的想法去与它有一些修改,并得到它的工作。诀窍在我用来与星期五交叉的桌子上。来到这里只是为了标记这个答案。 – prabugp 2014-12-11 13:21:33

+0

非常感谢 – syllabus 2014-12-11 13:31:47

0

你必须做2级嵌套,在你的嵌套查询中更改为外部连接for salesrep,所以每个代表至少有1条记录,然后与没有任何条件的星期五的连接每条记录至少有13条记录(fridays.datefield = innerfriday.datefield和(reportDate为null或reportDate = innerfriday.datefield))最后的右外部连接)

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

+0

感谢您的答复,但外部连接的销售代表是不需要的信息与期望的结果集,因为我永远知道哪些销售代表查询。而当我们进行交叉连接时,我们不会有空的reportDate,而且我们的表没有任何销售代表的空reportDate。但我会延长你的方法,看看是否能让我获得任何地方。 – prabugp 2014-12-03 10:52:58