Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Truy vấn MySQL - nối 3 bảng với nhau, nhóm theo một cột và đếm cho 2 bảng còn lại

Dựa trên sự hiểu biết của tôi, đây là truy vấn mà tôi đưa ra:


    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

Phân tích của truy vấn:

# 1. Nhận ID thành viên với số mục tiêu được liên kết (innerQuery)


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

# 2. Nhận id nhóm với tổng SUM mục tiêu (bên trong_1)


     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. Nhận tổng số thành viên mỗi nhóm (bên trong_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. RIGHT THAM GIA bên trong_1 và bên trong_2 (vì sẽ có NULL) và sử dụng IFNULL để kiểm tra và thay thế số 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết xuất MySQL theo truy vấn

  2. Truy vấn SQL, Chọn 5 gần đây nhất trong mỗi nhóm

  3. Đây có phải là một phương pháp an toàn để chèn dữ liệu biểu mẫu vào cơ sở dữ liệu MySQL không?

  4. MYSQL:cách sắp xếp lại bảng

  5. mysql tìm id nhỏ nhất + duy nhất có sẵn