gpt4 book ai didi

mysql - 即使在相关表中找不到相关记录,也可以从一个表中检索所有记录

转载 作者:行者123 更新时间:2023-11-29 00:26:14 24 4
gpt4 key购买 nike

我有一个应用程序可以检查记录的废物类型。该系统的一部分允许用户预测他们将回收多少废物,并在报告中列出预测的废物类型、预测的数量以及已记录的实际废物。

它的计算方式是有一个名为 forecastwaste 的表和一个名为 wastestream 的表。 wastestream 包含有关实际回收的废物类型的所有数据,forecastwaste 包含已预测的废物类型。 wastetypes 表包含可供用户选择的可用废物类型的名称。

我有这个 SQL 语句($contractid 包含契约(Contract)的 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 表,以便了解有多少 Material 被回收。 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) totalWeightSUM(ws.percent) totalPercent 返回 wastestream 表,但 forecaste 表中会有一个值试图引用它们,但 COALESCE 将无法使用它。

最佳答案

您需要在 forecastwaste 和 wastetypes 之间进行内部连接,再加上到 wastestream 的左连接:

SELECT ws.wastetype, SUM(ws.recordedweight) totalWeight, SUM(ws.percent) totalPercent, wt.id, wt.category, wt.defrecycling, fw.tonnes 
FROM c1skips.forecastwaste fw
JOIN c1skips.wastetypes wt ON (wt.id = fw.wastetype)
LEFT JOIN c1skips.wastestream ws
ON (ws.contractid = fw.contractid) AND (ws.wastetype = fw.wastetype)
WHERE fw.contractid = '602'
GROUP BY ws.wastetype;

我将 fw.contractid = '602' 替换为 (ws.contractid = fw.contractid) 作为连接条件。现在无需在两个地方编写 contractid,您可以在没有 WHERE 的情况下运行查询以返回所有行。

编辑:将外部表从 wastestream 更改为 forecastwaste

关于mysql - 即使在相关表中找不到相关记录,也可以从一个表中检索所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18796434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com