2012-07-17 24 views
0

我有一个查询的问题: 我有一个商店的列表,每个商店都有成员,并且有各种类别的会员资格(青铜,银,金...)MYSQL如何计算按类型分组的元素

这些表是:'商店','会员','membership_cards'。

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

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

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

店名,N°铜牌成员,N°silver_members,N°gold_members ....

+1

这当然可以用SQL查询来完成,但是您需要向我们提供关于表格模式的更多细节,以便我们能够理解这些关系。 – 2012-07-17 13:34:06

回答

0

根据您提供什么,你想要一个查询,如:

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 

如果您想了解成员的数量,而不是各组卡(如果成员可以有一个以上的卡) ,然后用更换的总和()表达:

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

不知道你的数据库架构,这是一个有点难以回答这个问题,但类似下面的东西应该做的工作:

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 

只是将列名称更改为您正在使用的名称。

+0

确定这个对我有好处,可以显示所有商店?即使那些没有任何成员的人? – Dario 2012-07-17 14:05:47

0
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功能的情况下,任何部件不具有卡