【问题标题】:MySQL right outer join queryMySQL右外连接查询
【发布时间】:2014-12-03 10:14:27
【问题描述】:

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

我有 2 个表,其中一个包含 SalesRep 详细信息,例如姓名、电子邮件等。我还有另一个表,其中包含具有报告日期、服务的客户和通过外键链接到 salesrep 的销售数据。需要注意的一点是,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

现在我的疑惑:

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

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

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

【问题讨论】:

  • 您是否尝试将其从查询中删除:where employeeId = 1 ?或者这样做:where employeeId IN (1,2)?
  • 试过了,但使用右外连接,我不会得到 26 行(每个销售代表一个)。上面发布的查询只是为了获取一个用户在所有 13 个星期五的名称和 0。
  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。

标签: mysql sql outer-join


【解决方案1】:

您必须首先选择您的行(没有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

【讨论】:

  • 我知道已经 10 天了.. 但我接受了你的想法并进行了一些修改并让它发挥作用。诀窍就在我用来与星期五交叉加入的表中。来到这里只是为了标记这个答案。
【解决方案2】:

您必须进行 2 级嵌套,在您的嵌套查询中更改为 salesrep 的外部联接,因此每个代表至少有 1 条记录,然后在没有任何条件的情况下与 fridays 连接,每个代表至少有 13 条记录, 然后最后右外连接条件 (fridays.datefield = innerfriday.datefield and (reportDate is null or reportDate=innerfriday.datefield))

效率很低,尽量用代码做,除了非常小的数据。

【讨论】:

  • 感谢您的回复,但不需要销售代表的外部联接,因为我总是知道要查询哪些销售代表。当我们进行交叉连接时,我们不会有空的reportDates,并且我们的表没有任何销售代表的空reportDate。但我会扩展你的方法,看看这是否能让我有所收获。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2013-02-25
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多