修复MySQL COUNT查询中的错误

时间:2017-07-11 15:14:27

标签: mysql sql

我有以下名为tbl_pet_owners的MySQL表:

+----+--------+----------+--------+--------------+
| id | name   | pet      | city   | date_adopted |
+----+--------+----------+--------+--------------+
|  1 | jane   | cat      | Boston | 2017-07-11   |
|  2 | jane   | dog      | Boston | 2017-07-11   |
|  3 | jane   | cat      | Boston | 2017-06-11   |
|  4 | jack   | cat      | Boston | 2016-07-11   |
|  5 | jim    | snake    | Boston | 2017-07-11   |
|  6 | jim    | goldfish | Boston | 2017-07-11   |
|  7 | joseph | cat      | NYC    | 2016-07-11   |
+----+--------+----------+--------+--------------+

在之前的Stack Overflow帖子中,我使用COUNT寻求帮助以获得每个城市的宠物数量,但如果一个人拥有两个或更多相同类型的宠物,那么这些宠物将被计为一个。宠物类型列在另一个名为tbl_pet_types的MySQL表中:

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

这是我到目前为止的代码:

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行添加到tbl_pet_owners时:

+----+------+-----+--------+--------------+
| id | name | pet | city   | date_adopted |
+----+------+-----+--------+--------------+
|  3 | jane | cat | Boston | 2017-06-11   |
+----+------+-----+--------+--------------+

返回的结果是:

Boston 5
NYC    1

他们应该是:

Boston 4
NYC    1

因为珍妮的所有宠物都属于同一类型。

似乎珍妮的猫被视为个体,但它们只应算作一只因为这两只猫属于同一类型。

有关如何解决此问题的任何提示?

2 个答案:

答案 0 :(得分:1)

我忘了我在pet_types表中添加了一行,将金鱼映射到海洋生物,因此吉姆的金鱼被计算两次。因此波士顿返回5而不是4。

答案 1 :(得分:0)

您可以向内部查询添加SELECT DISTINCT。 DISTINCT将删除重复的宠物(即拥有2个或更多的所有者)

select count(*), result.city from (
SELECT DISTINCT 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;