Mysql 如何将相关表的多个和作为子查询引用

Mysql 如何将相关表的多个和作为子查询引用,mysql,sql,subquery,Mysql,Sql,Subquery,我有一个数据表,我需要抽出每一行。此表(A)与另一个表B(在B中引用的A的许多实例)具有多对一关系 我想用大量的B值的总和来输出A的每一行;我可以考虑用Sub-Select来实现这一点,但它们感觉效率低下而且有点重复 B中有3列需要求和。我(感觉我)无法加入这些表,因为有时A根本不会出现在B中,而且通常A会出现多次 我读到: 除其他事项外 由于各种原因,我觉得这些对我没有帮助;人们建议加入,但我不认为我可以使用加入,因为相关行数为0+以上。此外,一些答案对问题过于具体,因此在

我有一个数据表,我需要抽出每一行。此表(
A
)与另一个表
B
(在
B
中引用的
A
的许多实例)具有多对一关系

我想用大量的
B
值的总和来输出
A
的每一行;我可以考虑用Sub-Select来实现这一点,但它们感觉效率低下而且有点重复

B
中有3列需要求和。我(感觉我)无法
加入这些表,因为有时
A
根本不会出现在
B
中,而且通常
A
会出现多次

我读到: 除其他事项外

由于各种原因,我觉得这些对我没有帮助;人们建议加入,但我不认为我可以使用加入,因为相关行数为0+以上。此外,一些答案对问题过于具体,因此在我的情况下似乎没有帮助

我得到的是: 示例数据,表创建:

    CREATE TABLE Countries (
    Id INT NOT NULL AUTO_INCREMENT,
    ISO VARCHAR(2) NOT NULL,
    ISO3 VARCHAR(3) NOT NULL,
    ISONumeric INT NOT NULL,
    CountryName VARCHAR(64) NOT NULL,
    Capital VARCHAR(64) NOT NULL,
    CurrencyCode VARCHAR(3) NOT NULL,
    PRIMARY KEY(Id)
);

CREATE TABLE Cities (
    cId INT NULL AUTO_INCREMENT,
    CityName VARCHAR(64) NOT NULL,
    Population INT(7) NOT NULL, 
    Natives INT(7) NOT NULL,
    Country TINYINT(3) NOT NULL,
    PRIMARY KEY(cId)
);

INSERT INTO Countries
    (ISO, ISO3, ISONumeric, CountryName, Capital, CurrencyCode)
VALUES
    ('AU', 'AUS', 36, 'Australia', 'Canberra',  'AUD'),
    ('DE', 'DEU', 276, 'Germany', 'Berlin',  'EUR'),
    ('GB', 'UKG', 1, 'Britain', 'London',  'GBP'),
    ('IN', 'IND', 356, 'India', 'New Delhi',  'INR'),
    ('LA', 'LAO', 418, 'Laos', 'Vientiane',  'LAK'),
    ('US', 'USA', 840, 'United States', 'Washington',  'USD'),
    ('ZW', 'ZWE', 716, 'Zimbabwe', 'Harare', 'ZWL')
;

INSERT INTO Cities
    (CityName, Population, Natives, Country)
VALUES
    ('London', 6431000, 1362434, 3),
    ('Sheffield', 136000, 1434, 3),
    ('Luton', 61000, 134, 3),
    ('Munich', 231000, 134214, 2),
    ('New York', 12131000, 16, 6),
    ('Washington', 210700, 343, 6)
;
查询生成示例:

SELECT Countries.*, 
(SELECT SUM(`Population`) FROM Cities WHERE `Country` = `Countries`.`Id` ) as pop,
(SELECT SUM(`Natives`) FROM Cities WHERE `Country` = `Countries`.`Id` ) as native
FROM Countries
这个查询很有效,但我觉得它很容易变得非常麻烦。它似乎是同一个表上的多个选择(
Cities
)(我的示例显示了两个
SUM
选择,但我最终会有更多选择)

SQL Fiddle:

我的问题是什么? 我希望在转储
A
的内容时,能够轻松地将
B
中与
A
相关的
A
的各个列进行求和(…)
以添加为输出。
B
中引用的
A
的次数可能为零或更多

如何比大量子查询更高效、重复更少地执行此操作?


例如,是否可以将所有总和合并到一个子查询中?

如果我猜正确,您的查询应如下所示-


您可能会发现在加入之前进行聚合更容易:

这样就无需重复
country
表中的所有列。如果
JOIN
键相同,可以简化为:

SELECT *
FROM Countries co LEFT JOIN
     (SELECT ci.Country as id,
             SUM(ci.Population) as pop,
             SUM(ci.Natives) as native
      FROM Cities ci 
      GROUP BY ci.Country
     ) ci
     USING (id);

这看起来很明显,现在你已经写好了!!是的,尝试一下这个给了我一些看起来正确的结果,(我还在检查)。谢谢。谢谢你的选择。你认为这些方法(你的和Mkrabai的)之间有很大的性能差距吗?
SELECT co.*, ci.pop, ci.natives
FROM Countries co LEFT JOIN
     (SELECT ci.Country,
             SUM(ci.Population) as pop,
             SUM(ci.Natives) as native
      FROM Cities ci 
      GROUP BY ci.Country
     ) ci
     ON ci.Country = co.Id ;
SELECT *
FROM Countries co LEFT JOIN
     (SELECT ci.Country as id,
             SUM(ci.Population) as pop,
             SUM(ci.Natives) as native
      FROM Cities ci 
      GROUP BY ci.Country
     ) ci
     USING (id);