Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL заявка - съединете 3 таблици заедно, групирайте по една колона и пребройте за другите 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. Вземете идентификатора на члена със свързаните с него цели (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)


     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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Поддържа ли се обектът TransactionScope напълно с помощта на MySqlConnector за .NET?

  2. Това истинска дълга анкета ли е?

  3. Не можа да се зареди файл или сборка „MySql.Data, Version=6.8.3.0 или една от неговите зависимости. Системата не може да намери посочения файл

  4. Код на грешка в MySQL:1305. FUNCTION JSON_EXTRACT не съществува във версия на MySQL клиент:5.5.52

  5. UTF8 MySQL проблеми на Rails - проблеми с кодирането с utf8_general_ci