【问题标题】:Selecting all rows from one table where condition in joined table从一个表中选择所有行,其中连接表中的条件
【发布时间】:2013-03-31 13:15:27
【问题描述】:

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

ProductionReport 表捕获每个产品的每周生产信息。我的应用会报告这些信息。

表结构

生产报告

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

产品

产品ID,产品名称
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

不幸的是,我得到的只是前 2 行。我相信这是因为 WHERE 子句针对连接表中的列。如果是这样的话,这显然是我的逻辑严重缺陷,但我不知道该怎么办。

有什么建议吗?

【问题讨论】:

    标签: mysql left-join


    【解决方案1】:

    试试这个

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

    【讨论】:

    • 怎么样...从来不知道你能做到这一点:) 谢谢!完美运行
    【解决方案2】:

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

    你可以把它改成pr.date is null or date(pr.date) = '2013-04-08'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-26
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      相关资源
      最近更新 更多