2009-08-24 9 views
2

どのようにその内容に基づいて行を数えることができますか? は、私がこの

[表A]
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

答えて

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の基準は、私があなたがそこで達成しようとしているものを正確に理解していない可能性があります。

+0

おそらくselect句で 'table_a.ID_COMPANY'を使う必要があります。 –

+0

ええ、 'GROUP BY'でもそうです。ありがとう、良いキャッチ。 – chaos

+0

tq!実際に私は自分のサイトに登録されている各企業のユーザーアカウント数を取得したいと思っています。 thx =) –

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つのステートメントクエリでそれを行った? –

0

マシューの返信を拡大して、私はあなたがUNIONとGROUP BYを利用することを提案します。例:

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

結果セットを1つ取得するには、これらの結果を結合する必要があります。

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)