Mysql 从联接表中条件所在的一个表中选择所有行

Mysql 从联接表中条件所在的一个表中选择所有行,mysql,left-join,Mysql,Left Join,我的数据库中有一个Products表和一个ProductionReport表 ProductionReport表捕获每个产品的每周生产信息。我的应用程序将报告此信息 表格结构 生产报告 productionreportid、productid、日期、数量 2013年4月08日第50页 2013年4月12日 产品 productid,产品名称 1、护肤霜 2、花生油 3、浴盐 4、洗发水 我的页面使用一个gridview,它将列出所有产品(从产品中选择productid、productname),

我的数据库中有一个Products表和一个ProductionReport表

ProductionReport表捕获每个产品的每周生产信息。我的应用程序将报告此信息

表格结构

生产报告

productionreportid、productid、日期、数量
2013年4月08日第50页
2013年4月12日

产品

productid,产品名称
1、护肤霜
2、花生油
3、浴盐
4、洗发水

我的页面使用一个gridview,它将列出所有产品(
从产品中选择productid、productname
),并加入ProductionReport表,以便显示用户可以更新的一周的所有产品和生产值的列表

我的问题是填充GridView的sql查询。它当前仅获取两个表中都有联接值的行:

SELECT pro.productname, pr.productionreportid, IFNULL(pr.qty, 0) qty
FROM Products pro
LEFT JOIN ProductionReport pr ON pro.productid = pr.productid
WHERE DATE(pr.date) = '2013-04-08'
因此,考虑到上述数据,我希望返回以下结果集

护肤霜,1,50
花生油,2,12
浴盐,0,0
洗发水,0,0

不幸的是,我得到的只是前两排。我认为这是因为WHERE子句针对联接表中的一列。如果是这样的话,这显然是我逻辑上的一个严重缺陷,但我不知道该怎么办

有什么建议吗?

试试这个

  SELECT  
     pro.productname, 
     pr.productionreportid, 
     IFNULL(pr.qty, 0) qty
  FROM 
    Products pro  
  LEFT JOIN ProductionReport pr  
    ON pro.productid = pr.productid 
    AND DATE(pr.date) = '2013-04-08'

基本上,将日期条件从WHERE子句移动到JOIN子句

如果pr.date为空,则
日期(pr.date)='2013-04-08'
将不匹配,这是正确的


您可以将其更改为类似于
pr.date为null或date(pr.date)='2013-04-08'

的内容,如何。。。我从来不知道你能做到:)谢谢!工作完美