Количество MySQL, основанное на условии из другой таблицы

У меня есть следующие таблицы.


Табличный тип
--------------------
id / тип
--------------------
1 / AA
--------------------
2 / BB
--------------------
3 / AA
--------------------
4 / BB
-------------------- 


Таблица: пользователи
--------------------
id / имя пользователя
--------------------
1 / abc
--------------------
2 / bcd
--------------------
3 / cde
--------------------
4 / def
-------------------- 


Таблица: методы
---------------------------------
id / user_id / details | type_id
---------------------------------
1 / 1 / detail_1 | 1
---------------------------------
2 | 1 / detail_2 / 3
---------------------------------
3 | 1 / detail_3 | 1
---------------------------------
4 / 1 / detail_4 / 3
---------------------------------
5 / 2 / detail_3 | 1
---------------------------------
6 / 2 / detail_5 / 2
---------------------------------
7 / 2 / detail_6 / 4
---------------------------------
8 / 2 / detail_2 / 3
---------------------------------
9 / 1 / detail_2 / 3
---------------------------------
10 / 1 / detail_2 / 3
---------------------------------


желаемый результат : 
---------------------------------------------------
Имя Пользователя / No_of_AA_details | No_of_BB_details |
---------------------------------------------------
abc| 4 | 0 |
---------------------------------------------------
bcd| 2 | 2 |
---------------------------------------------------

Мне нужно получить количество distinct detailsна основе типа из typesтаблицы.

Я пробовал эти запросы, но max I am getting is all the counts and not the distinct values.

SELECT u.username,
CASE WHEN t.type = 'AA' THEN count(distinct m.details) END AS No_of_AA_details,
CASE WHEN t.type = 'BB' THEN count(distinct m.details) END AS No_of_BB_details
FROM users as u inner join methods as m on u.id = m.user_id inner join types as t on t.id = m.type_id 
GROUP BY m.user_id


SELECT u.username,
SUM(t.type = 'AA') AS No_of_AA_details,
SUM(t.type = 'AA') AS No_of_BB_details
FROM users as u inner join methods as m on u.id = m.user_id inner join types as t on t.id = m.type_id 
GROUP BY m.user_id

Любые предложения приветствуются.

1 ответ

  1. Я не могу проверить это правильно знаю, но я думаю, что у вас была хорошая идея, вы можете попробовать :

    SELECT u.username,
      m.user_id,
      CASE
        WHEN t.type = 'AA' THEN 1
        ELSE 0
      END AS No_of_AA_details,
      CASE
        WHEN t.type = 'BB' THEN 1
        ELSE 0
      END AS No_of_BB_details
    FROM users as u
    INNER JOIN methods as m on u.id = m.user_id
    INNER JOIN types as t on t.id = m.type_id
    

    а теперь вам просто нужно сделать сумму :

    SELECT u.username,
          m.user_id,
          SUM (CASE
            WHEN t.type = 'AA' THEN 1
            ELSE 0
          END ) AS No_of_AA_details,
          SUM (CASE
            WHEN t.type = 'BB' THEN 1
            ELSE 0
          END ) AS No_of_BB_details
        FROM users as u
        INNER JOIN methods as m on u.id = m.user_id
        INNER JOIN types as t on t.id = m.type_id
        GROUP BY u.username, m.user_id