【发布时间】:2013-09-13 22:55:17
【问题描述】:
我有一个检查记录的废物类型的应用程序。系统的一部分允许用户预测他们将回收多少废物,并在报告中列出预测的废物类型以及预测的废物数量和记录的实际废物。
它的工作方式是有一个名为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
但是,我遇到的问题是,如果 forecastewate 表中没有 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;
但结果还是一样。将是 SUM(ws.recordedweight) totalWeight 或 SUM(ws.percent) totalPercent 返回 wastestream 表中的 NULL 值,但 forecaste 表中将有一个值试图引用它们,但 COALESCE 将不起作用用那个。
【问题讨论】:
-
考虑首先将该语句转换为使用 INNER JOIN 的语句以简化可读性。然后就是使用 LEFT JOIN 的问题。
标签: mysql sql cakephp-2.0