【问题标题】:mysql possible to select count(distinct(id) where col = 'value')?mysql 可以选择 count(distinct(id) where col = 'value')?
【发布时间】:2011-05-27 21:42:14
【问题描述】:

我以汽车制造商为例,非常适合我的情况。

我现在有一个示例查询,它给出了每个状态的简单计数:

选择 国家作为国家, 计数(不同(idnumber))作为总计 从 数据库表 在哪里 输入('本田','丰田','斯巴鲁') 通过...分组 状态 订购方式 状态

请注意,这会给我每个汽车品牌的计数,不包括福特、雪佛兰等。品牌列表将是每个品牌。

有没有一种方法可以让我在不诉诸子查询的情况下将其分解为每个州的计数?在我看来,这就像在 count(distinct(idnumber)) 选择中有一个 where 语句,但我不确定这是否可能。

这就是我的想法:

选择 国家作为国家, count(distinct(idnumber)) 作为 Total_State, (count(distinct(idnumber)) WHERE make = 'honda') as Total_Honda 在哪里 输入('本田','丰田','斯巴鲁') 通过...分组 状态 订购方式 状态

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以通过以下方式将多个列添加到您的组中:

    GROUP BY
      state, make
    

    我可能误解了你的问题,但你可以按两列分组,这样你就会得到加州制造的福特和加州制造的本田等的数量

    明确地说,您的查询是这样的:

    SELECT
      state as State,
      count(distinct(idnumber)) as Total,
      make as Make
    FROM
      database.table
    WHERE
      make IN('honda', 'toyota', 'subaru')
    GROUP BY
      state, make
    ORDER BY
      state
    

    作为一个有趣的测试,我这样做了:

    create table `cars` (
    `id` int(11),
    `make` varchar(255),
    `state` varchar(255)
    );
    
    
    insert into cars(id, make, state) values 
         (1, 'honda', 'ca'), (2, 'honda', 'ca'), (3, 'toyota', 'ca'), 
         (4, 'toyota', 'az'), (5, 'toyota', 'az'), (6, 'honda', 'az');
    
    
    SELECT state as State, count(id) as Total, make as Make
    FROM cars
    WHERE make IN('honda', 'toyota', 'subaru')
    GROUP BY state, make
    ORDER BY state
    

    又回来了:

    +-------+-------+--------+
    | State | Total | Make   |
    +-------+-------+--------+
    | az    |     1 | honda  |
    | az    |     2 | toyota |
    | ca    |     2 | honda  |
    | ca    |     1 | toyota |
    +-------+-------+--------+
    

    这是我所期望的。你是这么想的吗?

    【讨论】:

    • 有点。理想情况下,我会取回 50 行(每个州 1 行),其中包含州名称列、州总数以及州内每个品牌的总数。如果这是有道理的。
    • 好的,我明白了。你的idnumber真的不是唯一的吗?如果您需要使事情复杂化的独特(idnumber)。如果没有重复的 id,那么你可以使用 sum / if: select state, sum(if(make='honda', 1, 0)) as HondaCount, sum(if(make='toyota', 1, 0)) as ToyotaCount from cars where make in('honda', 'toyota') group by state;
    • 如果您确实需要该 distinct(idnumber) ,那么我不知道围绕子查询的任何方法。 (这会起作用:select state, sum(if(t.make='honda', 1, 0)) as HondaCount, sum(if(t.make='toyota', 1, 0)) as ToyotaCount from (select distinct(id), state, make from cars) t group by state;)但是,出于性能原因,我不会回避 this specific 子查询。在某些情况下,子查询在 mysql 中是邪恶的,但我不认为这是其中之一(更多的是子表而不是子查询)
    • 我认为这非常非常接近。 idnumber 是唯一的,但它不是品牌所独有的。 (它本质上是一个地址标识符,每个地址可以有多个品牌)。我将不得不做一些事情,看看这是否适用于这种情况。谢谢! :)
    • 很高兴为您提供帮助,这些很有趣。快速说明——如果您的 idnumber 是唯一的,或者对 (make,state) 对的限制更少,那么查询就可以了。问题将是重复计算 id=1、make='honda'、state='ca'... 或其他东西
    猜你喜欢
    • 2016-04-04
    • 2020-11-03
    • 1970-01-01
    • 2012-10-13
    • 2010-12-04
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多