2009-08-24 36 views
2

如何根據其內容計算行數? 假設我有臺這樣的

[表]
MySQL計數行

ID_COMPANY | NAME 
----------------------------- 
A1   | COMPANY A 


[表B]

ID_COMPANY | USER  | TYPE 
-------------------------------------- 
A1   | USER A | MANAGER 
A1   | USER B | DEPT001 
A1   | USER C | CUSTOMR 
A1   | USER D | DEPT002 
A1   | USER E | CUSTOMR 

我怎樣才能得到這樣的結果?

ID_COMPANY | NAME | TOTAL_MANAGER | TOTAL_STAFF_DEPT | TOTAL_CUST 
---------------------------------------------------------------------------- 
A1   | COMPANY A |    1 |    2 |   1 

THX傢伙

+0

如果我的答案解決了您的問題,您應該點擊答案旁邊的複選框將其標記爲「已接受」答案。 – chaos 2009-08-24 03:39:09

回答

7
SELECT 
    `table_a`.`ID_COMPANY`, 
    `NAME`, 
    SUM(IF(`TYPE` = 'MANAGER', 1, 0)) AS `TOTAL_MANAGER`, 
    SUM(IF(`TYPE` LIKE 'DEPT%', 1, 0)) AS `TOTAL_STAFF_DEPT`, 
    SUM(IF(`TYPE` = 'CUSTOMR', 1, 0)) AS `TOTAL_CUST` 
FROM `table_a` 
JOIN `table_b` 
USING (`ID_COMPANY`) 
GROUP BY `table_a`.`ID_COMPANY` 

SUM s的標準可能需要調整,因爲我不完全明白你想要達到的目標。

+0

您可能需要在select子句中使用'table_a.ID_COMPANY'。 – 2009-08-24 02:34:59

+0

是的,在「GROUP BY」中也是如此。謝謝,很好。 – chaos 2009-08-24 02:35:52

+0

tq!它解決了..實際上我想獲得每個註冊公司在我的網站有多少用戶帳戶。 THX =) – 2009-08-24 02:45:21

2

使用子查詢和統計,從他們的結果。

在有缺陷的「僞SQL」:

select ID_COMPANY, NAME, 
count(select * from b where type like "MAN*) as "TOTAL_MANAGER", 
count(select * from b where type like "DEPT*") as "TOTAL_STAFF_DEPT", 
count(select * from b where type like "CUST*") as "TOTAL_CUST" 

,當我說有缺陷的,我的意思是我沒有嘗試過這一點,我只是試圖讓思想跨越,而不是給你的東西只需複製&粘貼。

+0

不能用1語句查詢完成它? – 2009-08-24 02:21:55

0

在Matthew的回覆中擴展我建議你使用UNION和GROUP BY。如:

SELECT ID_COMPANY, NAME, COUNT(USER) AS TOTAL_MANAGER FROM TABLE_B WHERE TYPE LIKE 'MANAGER' GROUP BY ID_COMPANY 

您需要將這些結果合併得到一個結果集。

1

喜歡的東西:

SELECT 
    ID_COMPANY, 
    NAME, 
    (SELECT COUNT(ID_COMPANY) FROM table_b WHERE ID_COMPANY = table_a.ID_Company and TYPE = 'MANAGER') as TOTAL_MANAGER, 
    (SELECT COUNT(ID_COMPANY) FROM table_b WHERE ID_COMPANY = table_a.ID_Company and TYPE = 'DEPT001') as DEPT001C, 
    (SELECT COUNT(ID_COMPANY) FROM table_b WHERE ID_COMPANY = table_a.ID_Company and TYPE = 'DEPT002') as DEPT002C, 
FROM table_a 
GROUP BY ID_COMPANY 
0

...這是一個JOIN方法:

SELECT 
    a.id_company, 
    a.name, 
    mgr.cnt AS total_manager, 
    dept.cnt AS total_staff_dept, 
    cust.cnt AS total_cust 
FROM 
    a 
    JOIN 
    (SELECT id_company, COUNT(*) AS cnt 
    FROM b WHERE type = 'MANAGER' GROUP BY id_company) mgr 
    ON a.id_company = mgr.id_company 
    JOIN 
    (SELECT id_company, COUNT(*) AS cnt 
    FROM b WHERE type LIKE 'DEPT%' GROUP BY id_company) dept 
    ON a.id_company = dept.id_company 
    JOIN 
    (SELECT id_company, COUNT(*) AS cnt 
    FROM b WHERE type = 'CUSTOMR' GROUP BY id_company) cust; 

......這給了我(假設沒有更多的記錄比你顯示):

+------------+------+---------------+------------------+------------+ 
| id_company | name | total_manager | total_staff_dept | total_cust | 
+------------+------+---------------+------------------+------------+ 
| A1   | foo |    1 |    2 |   2 | 
+------------+------+---------------+------------------+------------+ 
1 row in set (0.00 sec)