Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Permintaan MySQL - gabungkan 3 tabel bersama, kelompokkan dengan satu kolom dan hitung untuk 2 lainnya

Berdasarkan pemahaman saya, berikut adalah pertanyaan yang saya buat:


    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

Rincian kueri:

#1. Dapatkan ID anggota dengan jumlah sasaran yang terkait (innerQuery)


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

#2. Dapatkan id tim dengan SUM total gol (inner_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. Dapatkan jumlah anggota total per tim (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. RIGHT JOIN inner_1 dan inner_2 (karena akan ada NULL) dan gunakan IFNULL untuk memeriksa dan mengganti 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. Pencarian wildcard di pencarian teks lengkap MySQL

  2. Tetapkan nilai berulang ke 0 sambil membiarkan nilai pertama saja

  3. Cara terbaik untuk membuat file konfigurasi (config.php) php

  4. Bagaimana cara mengatur innodb_buffer_pool_size global?

  5. Pilih data di antara dua tanggal?