请原谅这个问题的措辞,如果它稍微偏离。
我有一个可怕的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任何错别字/命名问题都是我为了这个问题而简化查询的结果;它们不在实际查询中。)
答案 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}}是个不错的主意吗?