【问题标题】:Fixing bug in MySQL COUNT query修复 MySQL COUNT 查询中的错误
【发布时间】:2017-12-15 17:54:32
【问题描述】:

我有以下名为 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

因为简的所有宠物都是同一类型。

好像简氏的猫被算作个体,但它们应该只算作一只,因为两只猫属于同一类型。

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

【问题讨论】:

  • 你能自己运行内部查询并发布结果吗?您确定所有字段都是相同的吗?因为它们是字符串,您可能会在其中包含空格或大写字母,这会造成混淆。
  • 我想通了。我忘记了我在 pet_types 表中添加了一行,将金鱼映射到海洋生物,所以 jim 的金鱼被计算了两次。因此波士顿返回 5 而不是 4。
  • 很好发现,很高兴它已修复!请关闭问题。

标签: mysql sql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以向内部查询添加 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;
    

    【讨论】:

      猜你喜欢
      • 2020-01-17
      • 2020-05-22
      • 2020-12-21
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多