MySQL左连接日期范围

MySQL左连接日期范围,mysql,sql,left-join,Mysql,Sql,Left Join,希望使用多个左联接运行查询。以下查询有效 SELECT directory.location, sales.covers, labor.hours FROM t_directory directory LEFT JOIN t_sales sales ON sales.id = directory.id AND sales.business_date = '2011-11-14' LEFT JOIN t_labor labor ON labor.id = directory.id AND labo

希望使用多个左联接运行查询。以下查询有效

SELECT directory.location, sales.covers, labor.hours
FROM t_directory directory
LEFT JOIN t_sales sales
ON sales.id = directory.id
AND sales.business_date = '2011-11-14'
LEFT JOIN t_labor labor
ON labor.id = directory.id
AND labor.business_date = '2011-11-14'
ORDER BY directory.id ASC
如果我试图在日期范围之间进行查询,就会出现问题。添加GROUPBY子句一直在复制行。现在我实际上使用了两个独立的查询,这可能是更好的实践,也是更好的解决方案。这纯粹是出于好奇

这是我到目前为止所拥有的

 SELECT directory.location, sales.covers, labor.hours
 FROM t_directory directory
 LEFT JOIN t_sales sales
 ON sales.id = directory.id
 AND sales.business_date BETWEEN '2011-11-13' AND '2011-11-14'
 LEFT JOIN t_labor labor
 ON labor.id = directory.id
 AND labor.business_date BETWEEN '2011-11-13' AND '2011-11-14'
 GROUP BY directory.id, sales.business_date, labor.business_date
 ORDER BY directory.id ASC
显然,我的GROUPBY子句有问题,也许还有其他错误

我在寻找这样的结果:

| location | covers | labor |
=============================
  loc1     |  300   | 99.40
  loc1     |  325   | 100.50
  loc2     |  250   | 89.00
  loc2     |  275   | 90.20
  loc3     |  400   | 100.00
  loc3     |  500   | 122.90
当然,我实际上得到的是:

| location | covers | labor |
=============================
  loc1     |  300   | 99.40
  loc1     |  300   | 100.50  
  loc1     |  325   | 99.40
  loc1     |  325   | 100.50   
  loc2     |  250   | 89.00
  loc2     |  250   | 90.20
  loc2     |  275   | 89.00
  loc2     |  275   | 90.20
  loc3     |  400   | 100.00
  loc3     |  400   | 122.90
  loc3     |  500   | 100.00
  loc3     |  500   | 122.90
如果您能帮助我们达到预期效果,我们将不胜感激

编辑: 下面是我想要加入的带有示例数据的表。他们都有一个共同的id

t_directory
| *id | location | 
|100  |   loc1   |
|101  |   loc2   |
|102  |   loc3   |

t_sales
| business_date | id | sales    | covers |
|  2011-11-13   | 103| 4000.00  | 300    |
|  2011-11-14   | 103| 4050.00  | 325    |

t_labor
|business_date | id | hours | 
| 2011-11-13   | 103| 99.40 |
| 2011-11-14   | 103| 100.50|

你预期的结果对我来说没有意义。
sales
labour
行之间没有关系,那么为什么
covers
值300应该与
labour
值99.40相邻?是什么把这两个价值观联系在一起的?这就是为什么您发现很难编写查询来生成结果的原因:您试图输出两列,其中每列中的数据都不相关


我可能还没解释清楚。我相信其他人可以

根据销售/人工预先查询分组,然后留给他们加入。如果一个表中有多行,是否会错误地弄乱返回记录计数,从而导致结果。。。试一试

select STRAIGHT_JOIN
      PreQualifiedIDAndDate.ID,
      PreQualifiedIDAndDate.business_date,
      directory.location, 
      PreQuerySales.TotalCovers, 
      PreQueryLabor.TotalHours
   FROM 
      ( select distinct 
              sales.ID,
              sales.Business_Date
           from t_sales sales
           where sales.business_date between  '2011-11-13' AND '2011-11-14'
        UNION
        select labor.ID,
              labor.Business_Date
           from t_labor labor
           where labor .business_date between  '2011-11-13' AND '2011-11-14' )
         as PreQualifiedIDAndDate

         JOIN t_directory directory
            on PreQualifiedIDAndDate.ID = directory.ID

         LEFT JOIN
         ( select sales.ID,
                  sales.business_Date,
                  sum(sales.covers) TotalCovers
              from t_sales sales
              where sales.business_date between  '2011-11-13' AND '2011-11-14'
              group by sales.ID, sales.Business_Date ) PreQuerySales
            on PreQualifiedIDAndDate.ID = PreQuerySales.ID
            AND PreQualifiedIDAndDate.Business_Date = PreQuerySales.Business_Date

         LEFT JOIN 
         ( select labor.ID,
                  labor.Business_Date,
                  sum( labor.hours ) TotalHours
              from t_labor labor
              where labor.business_date between  '2011-11-13' AND '2011-11-14'
              group by labor.ID, labor.Business_Date ) PreQueryLabor
            on PreQualifiedIDAndDate.ID = PreQueryLabor.ID
            AND PreQualifiedIDAndDate.Business_Date = PreQueryLabor.Business_Date

   GROUP BY 
      PreQualifiedIDAndDate.id,
      PreQualifiedIDAndDate.Business_Date
   ORDER BY 
      directory.id

尝试按
目录进行分组。位置也同意。缺少销售和劳动力之间的关系。我能看到的唯一“趋势”是,成本最低的保险和成本最低的劳动力。但这可能不是一条硬性规定。我的第一个想法是,你需要加入从地点到销售,然后从销售到劳动力;而不是每次都返回目录。但是,由于所有的连接都基于相同的关系,所以这无关紧要。我添加了表,以便您可以了解情况。封面是“封面数量”或人数,它们在我们的销售表中。抱歉,有任何混淆。那么这两个表是通过
业务\u日期关联的
?在您的查询中添加一个子句
,其中t_sales.business_date=t_labor.business_date
,应该可以。蒂姆,我认为这可能是解决方案。谢谢你的帮助。