sql >> データベース >  >> RDS >> Mysql

MySQLクエリ-3つのテーブルを結合し、1つの列でグループ化し、他の2つをカウントします

    私の理解に基づいて、私が思いついたクエリは次のとおりです。

    
        SELECT name, membersCount, IFNULL(totalCount, 0) goalsCount FROM
        (
          SELECT m.team_id, SUM(innerQuery.goalsCount) totalCount
          FROM (
            SELECT m.id memberId, COUNT(*) goalsCount
            FROM Members m
            JOIN Goals g
            ON m.id = g.member_id
            GROUP BY member_id
          ) innerQuery
          JOIN Members m
          ON innerQuery.memberId = m.id
          GROUP BY m.team_id
        ) inner_1
        RIGHT JOIN 
        (
          SELECT t.id, t.name, COUNT(*) membersCount
          FROM Teams t
          JOIN Members m
          ON t.id = m.team_id
          GROUP BY team_id
        ) inner_2
        ON inner_1.team_id = inner_2.id
    
    

    クエリの内訳:

    #1。メンバーIDとそれに関連する目標数を取得する(innerQuery)

    
    SELECT m.id memberId, COUNT(*) goalsCount
        FROM Members m
        JOIN Goals g
        ON m.id = g.member_id
        GROUP BY member_id
    

    #2。目標の合計(inner_1)でチームIDを取得します

    
         SELECT m.team_id, SUM(innerQuery.goalsCount) totalCount
          FROM (
              .... Sub-query in step 1
          ) innerQuery
          JOIN Members m
          ON innerQuery.memberId = m.id
          GROUP BY m.team_id
    

    #3。チームごとの合計メンバー数を取得する(inner_2)

    
        SELECT t.id, t.name, COUNT(*) membersCount
          FROM Teams t
          JOIN Members m
          ON t.id = m.team_id
          GROUP BY team_id
    

    #4。右結合inner_1とinner_2(NULLがあるため)そしてIFNULLを使用してその0をチェックして置き換えます

    
        SELECT name, membersCount, IFNULL(totalCount, 0) goalsCount FROM
        (
         .... Sub-query in step 2
        ) inner_1
        RIGHT JOIN 
        (
          .... Sub-query in step 3
        ) inner_2
        ON inner_1.team_id = inner_2.id
    
    



    1. mysqlデータベースにギリシャ文字を正しく挿入できません

    2. IN句のパラメータを使用したOracleストアドプロシージャ

    3. simpledbでページネーションを行う方法

    4. 既存のユーザーをmysqlデータベースに割り当てます