【问题标题】:MYSQL How to count elements grouped by typeMYSQL如何计算按类型分组的元素
【发布时间】:2012-07-17 13:31:52
【问题描述】:

我有一个查询问题: 我有一个商店列表,这些商店中的每一个都有会员,并且有各种会员类别(青铜、白银、黄金......)

这些表是:'shops'、'members'、'membership_cards'。

shops: id, name
members: id, shops_id, membership_id, first_name, last_name
membership_cards: id, description

我需要提取按每个商店的成员资格分组的成员数。我可以在不使用服务器端语言的情况下执行此操作吗?

最终的结果应该是这样的:

商店名称,n°bronze members,n°silver_members,n°gold_members ....

【问题讨论】:

  • 这当然可以通过 SQL 查询来完成,但您需要向我们提供有关表模式的更多详细信息,以便我们了解关系。

标签: mysql count group-by


【解决方案1】:

根据您提供的内容,您需要如下查询:

select shopid,
       sum(case when c.cardtype = 'Bronze' then 1 else 0 end) as Bronze,
       sum(case when c.cardtype = 'Silver' then 1 else 0 end) as Silver,
       sum(case when c.cardtype = 'Gold' then 1 else 0 end) as Gold
from shops s left outer join
     members m
     on s.shopid = m.shopid left outer join
     cards c
     on c.memberid = m.memberid
group by shopid

如果您想知道成员的数量,而不是每个组中的卡片数量(如果成员可以拥有多张卡片),则将 sum() 表达式替换为:

count(case when c.cardtype = 'Bronze' then m.memberid end)

【讨论】:

    【解决方案2】:

    在不知道您的数据库架构的情况下,回答这个问题有点困难,但应该可以使用以下方法:

    SELECT      shop.name,
                SUM(CASE WHEN membership_cards.category = 'Bronze' THEN 1 ELSE 0 END) AS Bronze,
                SUM(CASE WHEN membership_cards.category = 'Silver'THEN 1 ELSE 0 END) AS Silver,
                SUM(CASE WHEN membership_cards.category = 'Gold' THEN 1 ELSE 0 END) AS Gold
    FROM        shops
    INNER JOIN  members
    ON          shop.id = members.shopid
    INNER JOIN  membership_cards 
    ON          members.id = membership_cards.memberid
    GROUP BY    shop.name
    

    只需将列名更改为您正在使用的名称即可。

    【讨论】:

    • 好吧,这对我有好处,可以显示所有商店吗?甚至那些没有任何成员的?
    【解决方案3】:
    SELECT B.name,A.Bronze,A.Silver,A.Gold    
    FROM
    (
        SELECT S.id,
            SUM(IF(IFNULL(C.cardtype,'')='Bronze',1,0)) Bronze,
            SUM(IF(IFNULL(C.cardtype,'')='Silver',1,0)) Silver,
            SUM(IF(IFNULL(C.cardtype,'')='Gold'  ,1,0)) Gold
        FROM shops S
        LEFT JOIN members M ON S.id = M.shops_id
        LEFT JOIN membership_cards C ON M.membership_id = C.id
        GROUP BY S.id
    ) A
    INNER JOIN shops B USING (id);
    

    我使用IFNULL功能以防任何成员没有卡

    【讨论】:

      猜你喜欢
      • 2016-03-13
      • 2018-08-26
      • 2021-05-07
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多