我什至不确定这个问题的标题应该是什么,但让我们从我的数据开始吧。
我有一个用户列表,这些用户在属于特定培训中心的同时上了几课。
课程表
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 | ...
答案 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()