2009-08-24 92 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)