我的数据库中有一个Products表和一个ProductionReport表。
ProductionReport表捕获每种产品的每周生产信息。我的应用程序将报告此信息。
表格结构
ProductionReport
productionreportid,productid,date,qty
1,1,2013-04-08,50 2,2,204-04-08,12
产品
productid,productname
1,护肤霜
2,花生油
3,沐浴盐
4,洗发水
我的页面使用gridview,列出所有产品(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子句以连接表中的列为目标。如果是这样的话,这显然是我逻辑上的一个严重缺陷,但我不知道该怎么办。
有什么建议吗?
答案 0 :(得分: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子句
答案 1 :(得分:0)
你是正确的,如果pr.date为空,DATE(pr.date) = '2013-04-08'
将不匹配。
您可以将其更改为pr.date is null or date(pr.date) = '2013-04-08'