Mysql 对查询表中的行进行计数

Mysql 对查询表中的行进行计数,mysql,Mysql,我有4张不同的桌子: username table: | uid | username | user_type| +-----+----------+----------+ | 1 | Aaron | CT | | 2 | Ahmad | FT | | 3 | Akir | CT | | 4 | Adelyn | FT | | 4 | Adeeb | AP | | 4 | Aizad

我有4张不同的桌子:

username table:
| uid | username | user_type|
+-----+----------+----------+
| 1   | Aaron    | CT       |
| 2   | Ahmad    | FT       |
| 3   | Akir     | CT       |
| 4   | Adelyn   | FT       |
| 4   | Adeeb    | AP       |
| 4   | Aizad    | FT       |
| 4   | Adeline  | AP       |


proc_leader table:
| projectNo | process | proc_leader|
+-----------+---------+------------+
| 170001    | ANM BLD | Aaron      |
| 170001    | BGD COL | Ahmad      |

proc_checker table:
| projectNo | process | proc_checker |
+-----------+---------+--------------+
| 170001    | ANM BLD | Adeeb        |
| 170001    | ANM BLD | Adeline      |
| 170001    | BGD COL | Aizad        |

proc_staff table:
| projectNo | process | proc_staff |
+-----------+---------+------------+
| 170001    | ANM BLD | Aaron      |
| 170001    | ANM BLD | Adelyn     |
| 170001    | ANM BLD | Ahmad      |
| 170001    | BGD COL | Akir       |
然后我
UNION
所有表创建一个表,并获得每个用户的
user\u type

SELECT a.*FROM(
 (
   SELECT * FROM proc_leader t1 LEFT JOIN(
     SELECT username, user_type FROM user GROUP BY username
   ) t2 ON t1.proc_leader = t2.username GROUP BY t1.proc_leader
 ) UNION(
   SELECT * FROM proc_checker t1 LEFT JOIN(
     SELECT username, user_type FROM user GROUP BY username
   ) t2 ON t1.proc_checker = t2.username GROUP BY t1.proc_checker
 ) UNION(
   SELECT * FROM proc_staff t1 LEFT JOIN(
     SELECT username, user_type FROM user GROUP BY username
   ) t2 ON t1.proc_staff = t2.username GROUP BY t1.proc_staff
 )
) AS a
ORDER BY a.projectNo
目前,我的输出是:

| projectNo | process | proc_leader | user_type |
+-----------+---------+-------------+-----------+
| 170001    | ANM BLD | Adeeb       |    AP     |
| 170001    | ANM BLD | Adelyn      |    FT     |
| 170001    | BGD COL | Ahmad       |    FT     |
| 170001    | BGD COL | Aizad       |    FT     |
| 170001    | BGD COL | Akir        |    CT     |
| 170001    | ANM BLD | Aaron       |    CT     |
| 170001    | ANM BLD | Adeline     |    AP     |
| 170001    | BGD COL | Ahmad       |    FT     |
然后我要做的是计算每个进程的
user\u type
,并将其放在一个单元格中。所以我希望我的输出是这样的:

| projectNo | process |     count         |
+-----------+---------+-------------------+
| 170001    | ANM BLD | 1(CT)+2(AP)+2(FT) |
| 170001    | BGD COL | 2(FT)+1(CT)       |
我知道我可以使用
GROUP\u COncat()
将其放在一个单元格中,但如何从收到的表中进行计算

试试这个:

select 
    projectNo,
    process,
    GROUP_CONCAT(col separator '+') `count`
from (
SELECT
    projectNo,
    process,
    concat(count(*),'(',user_type,')') col
FROM(
 (
   SELECT * FROM proc_leader t1 LEFT JOIN(
     SELECT username, user_type FROM user GROUP BY username
   ) t2 ON t1.proc_leader = t2.username GROUP BY t1.proc_leader
 ) UNION(
   SELECT * FROM proc_checker t1 LEFT JOIN(
     SELECT username, user_type FROM user GROUP BY username
   ) t2 ON t1.proc_checker = t2.username GROUP BY t1.proc_checker
 ) UNION(
   SELECT * FROM proc_staff t1 LEFT JOIN(
     SELECT username, user_type FROM user GROUP BY username
   ) t2 ON t1.proc_staff = t2.username GROUP BY t1.proc_staff
 )
) AS a
group by projectNo, process, user_type
) t group by projectNo, process;

您不需要
左联接
联合中包含的每个表
。相反,只需使用一个
UNION
子查询并将其连接到
username

在下面的查询中,我报告了每个
projectNo
process
组的所有三种用户类型,即使计数为零。如果您真的不希望用户类型在计数为零的情况下出现,那么您需要做更多的工作

SELECT t2.projectNo,
       t2.process,
       CONCAT(
           CAST(SUM(CASE WHEN t1.user_type = 'CT' THEN 1 ELSE 0 END) AS CHAR(50)), '(CT)+',
           CAST(SUM(CASE WHEN t1.user_type = 'AP' THEN 1 ELSE 0 END) AS CHAR(50)), '(AP)+',
           CAST(SUM(CASE WHEN t1.user_type = 'FT' THEN 1 ELSE 0 END) AS CHAR(50)), '(FT)')
           AS count
FROM username t1
INNER JOIN
(
    SELECT projectNo, process, proc_leader AS username
    FROM proc_leader
    UNION ALL
    SELECT projectNo, process, proc_checker
    FROM proc_checker
    UNION ALL
    SELECT projectNo, process, proc_staff
    FROM proc_staff
) t2
    ON t1.username = t2.username
GROUP BY t2.projectNo,
         t2.process
此处演示:


项目编号
170001
既有
ANM BLD
又有
BGD COL
作为流程,那么为什么只有
ANM BLD
流程显示在您的预期结果中?您的数据似乎没有标准化。@TimBiegeleisen抱歉,项目编号中有一个输入错误。fixedMySQL使用concat(…)not+用户名表中有6种用户类型。它可能会根据用户的不同而改变。我不需要它为零,我只需要显示分配的人数。@YevgeniyBagackiy如果您愿意,您可以轻松地在我给您的查询中添加更多术语。您的示例数据只显示了三个术语,因此我的答案有三个术语。我给出的答案比您接受的答案更有效。但如果我添加所有六种类型,在最后一个表中,它将显示所有六种类型的0。我不需要显示零,只需要计算分配的类型。还可以更改或添加新的用户类型。所以每次更改用户名表后,我都必须更改查询