1

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

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

表结构

生产报告

productionreportid, productid, 日期, 数量
1, 1, 2013-04-08, 50
2, 2, 2013-04-08, 12

产品

productid, productname
1, 护肤霜
2, 花生油
3, 浴盐
4, 洗发水

我的页面使用了一个网格视图,它将列出所有产品 ( SELECT productid, productname FROM Products) 并加入 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 子句针对连接表中的列。如果是这样的话,这显然是我的逻辑上的一个严重缺陷,但我不知道该怎么办。

有什么建议么?

4

2 回答 2

2

试试这个

  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 子句

于 2013-04-09T08:02:45.580 回答
0

你是正确的,DATE(pr.date) = '2013-04-08'如果 pr.date 为空,那将不匹配。

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

于 2013-04-09T08:05:37.510 回答