为 A 中的每个项目从 B 和 C 创建对 return val 的查询

Create query to return val from B and C for each item in A

我有一个数据库,其中有一个包含 isos (isos.name) 列表的 table,一个包含具有 agents.id 的代理列表的 table,以及一个table 包含具有 merchants.id.

的商家列表

我想以关注结果结束

isos.name | Agents    | Merchants
ISO A     |     1     |     7
ISO B     |     2     |     96

以下两个查询都单独工作,但我不知道如何将它们组合起来以return 期望的结果:

SELECT `isos`.`name`, COUNT(agents.id)AS Agents
FROM `isos` 
LEFT JOIN `agents` ON `agents`.`iso_id` = `isos`.`id`
GROUP BY isos.name;

这个returns:

isos.name |代理商 国际标准化组织 | 1个 ISO B | 2

SELECT `isos`.`name`, COUNT(merchants.id)AS Merchants
FROM `isos` 
LEFT JOIN `merchants` ON `merchants`.`iso_id` = `isos`.`id`
GROUP BY isos.name;

这个returns:

isos.name |商家 国际标准化组织 | 7 ISO B | 96

非常感谢您的帮助!

使用相关子查询:

SELECT i.name,
       (SELECT COUNT(*)
        FROM agents a
        WHERE a.iso_id = i.id
       ) AS Agents,
       (SELECT COUNT(*)
        FROM merchants m
        WHERE m.iso_id = i.id
       ) AS merchants
FROM isos i;

这假设 nameisos 中是唯一的。

使用相关子查询的最重要原因是它会产生正确的答案。您正在沿着不同的维度(大概)进行联接,因此联接将为商家和代理商生成笛卡尔积。

第二个原因是,对于 agents(iso_id)merchantes(iso_id) 上的索引,这应该非常快 -- 而且更快,因为它避免了在外部查询中进行聚合。