我有一个检查记录的废物类型的应用程序。该系统的一部分允许用户预测他们将回收多少废物,并在报告中列出预测的废物类型以及预测的废物数量和已记录的实际废物。
它的工作方式是有一个名为forecastwaste
的表和一个名为 的表wastestream
。wastestream
保存所有关于实际已回收的废物类型的数据,并forecastwaste
保存已预测的废物类型。该wastetypes
表包含用户可以选择的可用废物类型的名称。
我有这个 SQL 语句($contractid
包含合同的 id):
SELECT ws.wastetype, SUM(ws.recordedweight) totalWeight, SUM(ws.percent) totalPercent, wt.id, wt.category, wt.defrecycling, fw.tonnes
FROM wastestream ws, wastetypes wt, forecastwaste fw
WHERE ws.contractid = ".$contractid."
AND fw.contractid = ".$contractid."
AND ws.wastetype = wt.id
AND fw.wastetype = wt.id
GROUP BY ws.wastetype
但是,我遇到的问题是,如果在forecastegate 表中存在不在表中的废物类型,则wastestream
查询将不会显示任何内容。我想得到它,以便如果在wastestream
表中找不到任何结果,查询仍将显示forecastewaste 记录并0
在找不到任何内容时返回。当前查询不允许这样做。
我怎样才能使查询工作,以便它完成我需要的工作?
编辑
感谢 Bandydan,我重写了查询,现在看起来像这样:
SELECT ws.wastetype, SUM(ws.recordedweight) totalWeight, SUM(ws.percent) totalPercent, wt.id, wt.category, wt.defrecycling, fw.tonnes
FROM c1skips.wastestream ws
LEFT JOIN c1skips.wastetypes wt ON (wt.id = ws.wastetype)
INNER JOIN c1skips.forecastwaste fw ON (wt.id = fw.wastetype)
WHERE fw.contractid = '602'
AND ws.contractid = '602'
GROUP BY ws.wastetype;
我也会解释一下我正在努力做的更好的事情。
我有一个名为的表forecastwaste
,在该表中我有以下数据:
|---------------------------------|
| wastetype | tonnes | contractid |
|-----------|--------|------------|
| 1 | 10 | 602 |
| 2 | 20 | 602 |
| 3 | 50 | 602 |
|-----------|--------|------------|
然后用这张表来查看wastestream
表格,看看有多少材料被回收了。该wastestream
表如下所示:
|-----------------------------------------|
| wastetype | recordedweight | contractid |
|-----------|----------------|------------|
| 1 | 2 | 602 |
| 1 | 4 | 602 |
| 2 | 20 | 602 |
|-----------|----------------|------------|
两个表都引用了该wastetype
表,该表标识了废物类型的编号。
wastestream
对于当前查询,它只会在结果出现在表中时才返回结果。但是,我想要它,即使wastestream
表中没有记录,它也会返回 0。
编辑 2
我已经COALESCE
像这样添加到我的查询中:
SELECT ws.wastetype, SUM(ws.recordedweight) totalWeight, SUM(ws.percent) totalPercent, wt.id, wt.category, wt.defrecycling,
COALESCE(ws.recordedweight, 0) tonnes
FROM c1skips.wastestream ws
LEFT JOIN c1skips.wastetypes wt ON (wt.id = ws.wastetype)
INNER JOIN c1skips.forecastwaste fw ON (wt.id = fw.wastetype)
WHERE fw.contractid = '602'
AND ws.contractid = '602'
GROUP BY ws.wastetype;
但结果还是一样。它将是返回表中的 NULL 值的theSUM(ws.recordedweight) totalWeight
或 the ,但表中将有一个值试图引用它们,但不适用于该值。SUM(ws.percent) totalPercent
wastestream
forecaste
COALESCE