【问题标题】:SQL count with join带连接的 SQL 计数
【发布时间】:2015-11-23 18:56:55
【问题描述】:

完全新手。再试一次。

2 表业务和用户

企业有 IdNum、created_at、account_type、business_name 用户有 IdNum、国家、名字、姓氏

问题:总共有多少家企业来自日本?

我知道我需要使用内连接。

【问题讨论】:

  • 那些是only 列吗?因为他们似乎不太可能都通过他们的 id 列加入。从每个表中提供一些示例数据,首先删除任何被认为是私有的信息。
  • 你的例子没有意义。您说只有两个表,Users 和 Biz——然后您加入 Db_Users 和 Db_Partners。您正在寻找加拿大,但使用“JP”。

标签: sql join count


【解决方案1】:

如果您想要加拿大所有企业的总数(假设您可以从用户中的 ID 字段加入到 Biz 中的 ID 字段),则每个不同的企业只计算一次 -

select count(distinct u.country) --will only count unique entries once
from Biz b
inner join Users u 
on b.ID = u.ID
where u.country = 'Japan'

如果您想要计算所有行的数量,而不是唯一的行-

select count(u.country) --will count all entries
from Biz b
inner join Users u 
on b.ID = u.ID
where u.country = 'Japan'

【讨论】:

  • 示例中的左连接被 where 子句条件覆盖,应该是内连接,并且在所有列引用中使用表别名。
  • @Used_By_Already 只有 1 个列引用,并且该名称不会在两个表中都存在。代码应该以任何一种方式运行,但我会添加它以保持一致性。还有关于内连接和左连接,在应用过滤器后它们都会做同样的事情,因为不匹配将为 NULL。即使我进行了内部连接,我仍然需要为 u.country 过滤器添加 where 子句。
  • “关于内连接和左连接,它们都会做同样的事情” = exactly my point 所以不要使用更昂贵的左连接...回答中涉及到教育元素
【解决方案2】:

我做了一些假设并创建了这个例子。

首先我创建了两个表,db_users 和 db_partners 插入了一些样本数据。我假设“用户”是 “合作伙伴”的销售经理和每个合作伙伴 被分配一个用户。用户可以有多个合作伙伴。 奇怪的是“国家”是用户的一个属性, 不是合作伙伴,但我就是这样解释这个例子的。

MariaDB [test_time]> create table db_users ( 
  UserID int unsigned not null auto_increment primary key,
  UserName varchar(20),
  Country varchar(8) 
);

MariaDB [test_time]> create table db_partners ( 
  PartnerID int unsigned not null auto_increment primary key,
  PartnerName varchar(20),
  Created datetime,
  Size int unsigned,
  UserID int unsigned
);

MariaDB [test_time]> insert into db_users
  (UserName,Country) 
values 
  ('Abel','CA'),
  ('Baker','CA'),
  ('Charlie','JP'),
  ('Donald','JP'),
  ('Edgar','JP')
;

MariaDB [test_time]> insert into db_partners 
  (PartnerName,Created,Size,UserID) 
values 
  ('Kraft',now(),45,1),
  ('Ford',now(),66,2),
  ('Hortons',now(),22,1),
  ('Kroger',now(),15,4)
;

然后我选择了关联用户在CA的合作伙伴:

MariaDB [test_time]> select 
  UserName,PartnerName 
from 
  db_users join db_partners using (UserID) 
where 
  Country='CA'
;
+----------+-------------+
| UserName | PartnerName |
+----------+-------------+
| Abel     | Kraft       |
| Abel     | Hortons     |
| Baker    | Ford        |
+----------+-------------+
3 rows in set (0.00 sec)

MariaDB [test_time]> select 
  count(Country) 
from 
  db_users join db_partners using (UserID) 
where 
  Country='CA'
;
+----------------+
| count(Country) |
+----------------+
|              3 |
+----------------+
1 row in set (0.00 sec)

我不确定这是你想要的。如果不是,请澄清你的 问题。

【讨论】:

    【解决方案3】:

    如果 IdNum 是您的外键(表之间的连接条件),请使用

    SELECT count(*)
    FROM Business, Users
    WHERE Business.IdNum = Users.IdNum
    AND  Business.country = 'Japan';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 2021-12-28
      • 2018-11-14
      • 1970-01-01
      • 2021-10-19
      • 2015-01-01
      • 2011-01-14
      相关资源
      最近更新 更多