MySQL добавить среднее число по идентификатору в существующий выбор с идентификатором - PullRequest
0 голосов
/ 04 июля 2019

Я даже не уверен, каким должен быть заголовок этого вопроса, но давайте начнем с моих данных.

У меня есть таблица пользователей, которые прошли несколько уроков, принадлежа к определенному учебному центру.

таблица урока

id | lesson_id | user_id | has_completed
----------------------------------------
1  | asdf3314  |    2    |      1
2  | d13saf12  |    2    |      1
3  | a33adff5  |    2    |      0
4  | a33adff5  |    1    |      1
5  | d13saf12  |    1    |      0

таблица пользователя

id | center_id | ...
----------------------------------------
1  |    20     | ...
2  |    30     | ...

стол центра обучения

id | center_name | ...
----------------------------------------
20 |  learn.co   | ...
30 |  teach.co   | ...

Я написал небольшой кусок, но теперь застрял, так как не знаю, как поступить.В этом утверждении подсчитывается общее количество выполненных уроков на пользователя.затем он вычисляет среднее завершенное значение из идентификатора центра.если два пользователя принадлежат центру и выполнили 3 урока и 2 урока, он находит среднее значение 3 и 2, а затем возвращает его.а также добавьте средние данные из подобного оператора выбора, как указано выше, к каждому запрашиваемому центру.Кажется, я не могу передать идентификатор центра подзапросу, поэтому должен существовать принципиально иной способ выполнить тот же запрос, но также пройти через учебные центры.

Пример желаемого результата:

center.id | avg_completion | ...training center table
-----------------------------------------------------
     20   |       2        | ...

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Ваш основной запрос должен выбрать a.center_id, а затем использовать GROUP BY center_id.Затем вы можете присоединиться к нему с таблицей training_center.

SELECT c.*, x.avg_completion
FROM training_center AS c
JOIN (
    SELECT
        a.center_id,
        FLOOR(AVG(a.total)) AS avg_completion
    FROM (
        SELECT 
            user_id
            user.center_id,
            count(*) AS total 
        FROM lesson 
        JOIN user ON user.id = user_id 
        WHERE is_completed = 1 AND center_id = 2
        GROUP BY user_id) AS a
    GROUP BY a.center_id) AS x
ON x.center_id = c.id
0 голосов
/ 04 июля 2019

Если я правильно понимаю:

select u.center_id, count(*) as num_users,
       sum(l.has_completed) as num_completed,
       avg(l.has_completed) as completed_ratio
from lesson l join
     user u
     on l.user_id = u.id
group by u.center_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...