2012-07-17 26 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功能的情況下,任何部件不具有卡