将 MySQL 的 COUNT 与两个表一起使用

Posted

技术标签:

【中文标题】将 MySQL 的 COUNT 与两个表一起使用【英文标题】:Using MySQL's COUNT with two tables 【发布时间】:2017-12-10 18:48:25 【问题描述】:

我有以下名为 tbl_pet_owners 的 mysql 表:

+--------+----------+--------+
| name   | pet      | city   |
+========+==========+========+
| jane   | cat      | Boston |
+--------+----------+--------+
| jane   | dog      | Boston |
+--------+----------+--------+
| jack   | cat      | Boston |
+--------+----------+--------+
| jim    | snake    | Boston |
+--------+----------+--------+
| jim    | goldfish | Boston |
+--------+----------+--------+
| joseph | cat      | NYC    |
+--------+----------+--------+

我想使用 COUNT 来获取每个城市的宠物数量,但是如果一个人拥有两个或多个相同类型的宠物,那么这些宠物被计为一个。宠物类型列在另一个名为 tbl_pet_types 的 MySQL 表中:

+----------+---------+
| pet      | type    |
+==========+=========+
| cat      | mammal  |
+----------+---------+
| dog      | mammal  |
+----------+---------+
| snake    | reptile |
+----------+---------+
| goldfish | fish    |
+----------+---------+

因此,由于简的猫和狗属于同一类型,因此它们被视为一只宠物。 在此示例中,结果将是:

Boston 4
NYC    1

关于如何实现这一点的任何提示?

【问题讨论】:

所以你是按城市、所有者和宠物类型分组的? 是的。没错。 到目前为止你尝试过什么?查看Join tbl_pet_types 表。 从 tbl_pet_owners GROUP BY 城市中选择城市,计数(DISTINCT 名称,宠物) 你尝试这样做会得到什么? 【参考方案1】:

看看这是否有效。

SELECT PO.city, COUNT(DISTINCT PO.name, PT.type) 
FROM tbl_pet_owners PO
JOIN tbl_pet_types PT ON PO.pet = PT.pet 
GROUP BY PO.city

【讨论】:

【参考方案2】:

它可以优化,但有效:

select count(*), result.city from (
    select owners.city, types.type, owners.name
    from tbl_pet_owners owners
    left join tbl_pet_types types on owners.pet = types.pet group by owners.city, owners.name, types.type
) as result
group by result.city;

【讨论】:

【参考方案3】:
SELECT o.city, COUNT(DISTINCT o.name, t.type)
FROM tbl_pet_owners o, tbl_pet_types t
WHERE o.pet = t.pet
GROUP BY city

【讨论】:

以上是关于将 MySQL 的 COUNT 与两个表一起使用的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL:与 Group_Concatenate 一起使用的两个表上的左连接

如何使触发器与两个源表一起工作?

如何将 Count(*) 与 DAL2 一起使用?

如何将两个表与对应相同id号的相同行数合并在一起?

mysql left join 右表存在重复数据,怎么处理

MySQL数据库联合查询与连接查询