gpt4 book ai didi

mysql - 查询 Mysql - 对于两个表中都不存在的值返回 0

转载 作者:行者123 更新时间:2023-11-29 07:52:28 25 4
gpt4 key购买 nike

我在 mysql 中的一个查询遇到一个问题。我有 2 个表:表 A 和表 B

表A:

名称 - 总计

法国 | 20
西类牙 | 10
英格兰 | 5
意大利 | 10
法国 | 5

表B

名称

法国
西类牙
意大利
法国
希腊

我的目标是获得表 B 中每个值的总变量之和,即:

法国 | 25
西类牙 | 10
意大利 | 10
法国 | 5
希腊 | 0

我的问题是,当表 B 中的值在表 A 中不存在时,我不能返回 0。

此刻我有这样的疑问:

select B.name, SUM(A.total) 
from table A , table B
where A.name = B.name
group by B.name
having count(B.name)>1

最佳答案

要从表 B 中返回在表 A 中没有匹配行的行,您可以使用“外部”连接操作。

首先,放弃连接操作的老式逗号语法,而使用 JOIN 关键字。要指定“外部”联接,请在“JOIN”关键字之前使用关键字“LEFT”,将驱动表(表B,您想要返回所有行的表,位于 JOIN 的左侧。并将在两个表之间执行“匹配”的比较谓词从WHERE 子句到 ON 子句。

在示例数据中,我注意到表 B 中有“重复的”name 值(例如 'France'),您显示的结果集包含这两行:

France | 25
France | 5

我们可以看到第一行是如何生成的,即表A中两个'France'行的值的总和,但第二行,这有点难以弄清楚。 (也许这就是您的查询中的 HAVING 子句试图处理的问题?)

因此,为了简化事情,我将继续假设示例输出中的第二个 France 行在结果中实际上并不需要

根据示例数据和指定的结果(除了第二个 France 5 行),我们可以执行类似的操作,使用内联 View 获取不同的 列表来自 B 的名称

SELECT d.name
, IFNULL(SUM(a.total),0) AS total
FROM ( SELECT b.name
FROM B b
GROUP BY b.name
) d
LEFT
JOIN A a
ON a.name = d.name
GROUP BY d.name
<小时/>

如果表B实际上没有重复的name值,而是有'England'代替第二个 'France' 行,结果应包括 England | 5 而不是 法国 | 5 ...

如果我们保证name列在表B中是唯一的,我们可以消除内联 View ,只需这样做:

SELECT b.name
, IFNULL(SUM(a.total),0) AS total
FROM B b
LEFT
JOIN A a
ON a.name = b.name
GROUP BY b.name
<小时/>

上面的查询是返回您所描述的结果的规范模式,但它不是唯一的模式。还有其他几种形式也将返回等效结果。

作为另一种方法的演示,该方法不使用连接操作:

SELECT b.name
, IFNULL(SELECT SUM(a.total) FROM A a WHERE a.name = b.name) AS total
FROM B b

对于从 B 返回的大量行,此方法的执行效果通常不如连接。 (对于较小的集合,我们不会注意到差异,而对于较大的集合,性能差异可能会变得明显。)

关于mysql - 查询 Mysql - 对于两个表中都不存在的值返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26069089/

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