MySQL - 在连接时伪表内引用外表

时间:2018-01-10 16:51:28

标签: mysql sql join

请原谅这个问题的措辞,如果它稍微偏离。

我有一个可怕的SQL查询,以下是简化的摘录。

视频学费网站。查询拉出了课程"实例" (当用户开始一个课程时,它会创建一个与之相关的课程实例),然后用一个逗号分隔的列表显示每个视频的问题数量(该课程由一系列视频组成)附带的问题。)

例如,如果一个课程有6个视频,前3个视频有1个问题,最后3个有3个问题,那么输出将是:

------------------
| num_qs_per_vid |
------------------
| 1,1,1,3,3,3    |
------------------

查询摘录:

SELECT
    ci.instance_id,
    ci.course_id,
    GROUP_CONCAT(COALESCE(questions.num_qs, 0) ORDER BY videos.index) AS num_qs_per_vid,
FROM course_instances ci
LEFT JOIN videos ON ci.course_id IN (
    SELECT course_id_id
    FROM _taxonomy_assocs
    WHERE item_id = videos.id
)
LEFT JOIN (
    SELECT questions.id, questions.vid_id, unit, COUNT(*) as num_qs
    FROM questions
    WHERE unit = **problem** /* <-- need to reference outer ci.course_id */
    GROUP BY questions.vid_id
) questions ON questions.vid_id = videos.id && questions.unit = ci.course_id
WHERE ci.user = '{hard-coded user ID goes here}'
GROUP BY ci.id

我放*problem*的地方我需要引用外部课程实例ID。理想情况下我会这样做:

WHERE unit = ci.course_id

但是这会引发一个错误,说ci.course_id是一个未知的专栏。我认为这是一个年表问题,即内部部分在外部部分之前运行,但我不知道如何解决这个问题。

如果我指定特定的课程实例ID,那么一切都很好。

WHERE unit = "abcdef123"

......就在我想要获得几个课程实例的时候。

(PS任何错别字/命名问题都是我为了这个问题而简化查询的结果;它们不在实际查询中。)

1 个答案:

答案 0 :(得分:2)

LEFT JOIN (
    SELECT questions.id, questions.vid_id, unit, COUNT(*) as num_qs
    FROM questions
    -- REMOVE THIS :
    -- WHERE unit = **problem** /* <-- need to reference outer ci.course_id */
    --               ADD THIS:
    GROUP BY questions.vid_id, questions.unit
) questions ON questions.vid_id = videos.id && questions.unit = ci.course_id

另外,如果questions.id中不包含SELECT,那么在GROUP BY中不包含{1}}是个不错的主意吗?