MySQL将按ID计数的平均值添加到ID为现有的选择

时间:2019-07-04 00:01:26

标签: mysql sql

我什至不确定这个问题的标题应该是什么,但让我们从我的数据开始吧。

我有一个用户列表,这些用户在属于特定培训中心的同时上了几课。

课程表

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   | ...

我写了一个小块,但是由于我不知道如何进行而被卡住了。该语句获取每个用户的已完成课程的总数。然后,它根据中心ID得出平均完成价值。如果有两个用户属于一个中心,并且完成了3节课和2节课,则它求平均值3和2,然后将其返回。

SELECT
    FLOOR(AVG(a.total)) AS avg_completion,
FROM
(SELECT 
    user_id,
    user.center_id,
    count(user_id) AS total 
    FROM lesson 
    LEFT JOIN user ON user.id = user_id 
    WHERE is_completed = 1 AND center_id = 2
    GROUP BY user_id) AS a;

我的问题是如何遍历培训中心表,并如何将上述类似选择语句的平均数据附加到所查询的每个中心。我似乎无法将中心ID传递给子查询,因此必须有一种根本不同的方法来实现相同的查询,而且还要遍历培训中心。

所需结果的示例:

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

2 个答案:

答案 0 :(得分:1)

您的主查询需要选择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

答案 1 :(得分:0)

如果我正确理解:

context.timestamp()