【问题标题】:Count two different rows in mysql query在mysql查询中计算两个不同的行
【发布时间】:2017-01-19 17:52:26
【问题描述】:

我有组织。每个组织都可以有成员和项目。 我想获取具有成员和项目数量的组织列表。 例如,

Organization | Members | Projects | Action
------------------------------------------
Org 1        | 5       | 6        | Delete - Edit
Org 2        | 2       | 9        | Delete - Edit

我正在使用这个查询,

SELECT COUNT(m.id) as members, COUNT(p.id) as projects, 
       o.status,o.organization_name,o.logo, o.id as id
from tbl_organizations o 
LEFT JOIN tbl_organization_members m  ON (o.id = m.organization_id) 
LEFT JOIN tbl_projects p ON (o.id = p.organization_id) 
WHERE o.status= 'active' AND o.created_by= 1

但是项目数量的产出等于成员的数量。 如何使用查询制作上述示例?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    按组织列分组并计算不同的 ID

    SELECT o.status,o.organization_name, o.logo, o.id as id,
           COUNT(distinct m.id) as members, COUNT(distinct p.id) as projects, 
    from tbl_organizations o 
    LEFT JOIN tbl_organization_members m  ON (o.id = m.organization_id) 
    LEFT JOIN tbl_projects p ON (o.id = p.organization_id) 
    WHERE o.status= 'active' 
    AND o.created_by= 1
    GROUP BY o.status, o.organization_name, o.logo, o.id
    

    【讨论】:

      【解决方案2】:

      试试这个方法:

      SELECT o.id as id, o.organization_name, cnt_ as members, cnt_p as projects
      from tbl_organizations o 
      LEFT JOIN (
         SELECT organization_id, COUNT(id) cnt_m
         FROM tbl_organization_members
         GROUP BY organization_id
      ) m  ON (o.id = m.organization_id) 
      LEFT JOIN (
         SELECT organization_id, COUNT(id) cnt_p
         FROM tbl_projects 
         GROUP BY organization_id
      ) p ON (o.id = p.organization_id) 
      WHERE o.status= 'active' AND o.created_by= 1
      

      这样你JOIN 到一个已经聚合 版本的成员/项目表,以便获得每个organization_id 的成员/项目计数。

      【讨论】:

        【解决方案3】:

        您可以关联子查询:

        SELECT
            o.id as Organization,
            (SELECT COUNT(*) FROM tbl_organization_members WHERE organization_id = o.id) as members,
            (SELECT COUNT(*) FROM tbl_projects WHERE organization_id = o.id) as projects
        FROM
            tbl_organizations o
        WHERE
            o.status= 'active' AND o.created_by = 1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-07
          • 2013-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多