【发布时间】:2010-12-30 03:36:11
【问题描述】:
我正在尝试在一个查询中执行此操作。几天前我问了一个类似的问题,但我的个人要求发生了变化。
我有一个游戏类型的网站,用户可以在其中参加“课程”。我的数据库中有三个表。
我正在使用 MySQL。我有四张桌子:
- hl_classes (int id, int 教授, varchar 类,文本描述)
- hl_classes_lessons(int id,int 类 ID,varchar 课程标题,varchar lexiconLink, 文本课程数据)
- hl_classes_answers (int id, int course_id, int 学生, 文本 submit_answer,int 百分比)
hl_classes 存储网站上的所有类。
课程是每个班级的单独课程。一个班级可以有无限的教训。每节课都有特定的学期。
hl_classes_terms 存储所有术语的列表,当前术语的字段 active = '1'。
当用户提交他们对课程的答案时,它会存储在 hl_classes_answers 中。用户每节课只能回答一次。课程必须按顺序回答。所有用户都参加所有“课程”。
我要做的是为每个用户在每个班级中学习下一课。当用户开始时,他们在第 1 学期。当他们完成每节课的所有 10 节课时,他们进入第 2 学期。当他们完成每节课的第 20 课时,他们进入第 3 学期。假设我们知道用户是由 PHP 变量 $term 输入。
所以这是我目前正在尝试按摩的问题,但它不起作用。特别是因为 hC.id 在 WHERE 子句中是未知的
SELECT hC.id, hC.class, (SELECT MIN(output.id) as nextLessonID
FROM ( SELECT id, class_id
FROM hl_classes_lessons hL
WHERE hL.class_id = hC.id
ORDER BY hL.id
LIMIT $term,10 ) as output
WHERE output.id NOT IN (SELECT lesson_id FROM hl_classes_answers WHERE student = $USER_ID)) as nextLessonID
FROM hl_classes hC
我这个查询背后的逻辑是首先对每个类;选择当前用户所在学期中的所有课程。从这个排序用户已经完成的课程并获取尚未完成的课程的 MINIMUM id。这将是用户必须做的一课。
我希望我的问题已经足够清楚了。
【问题讨论】:
-
定义“不起作用”。查询是否产生错误?结果有错吗?如果是这样,它们哪里错了?它们是什么,你期望它们是什么?
-
我确实提到它没有运行并且我得到一个错误,但我得到的具体错误是:查询错误:'where 子句'中的未知列'hC.id'。我知道我可以选择 SELECT *, (SELECT id FROM hl_classes_lessons WHERE class_id = hC.id LIMIT 1) as courseID FROM hl_classes hC。但这不起作用,我认为这是因为我更深入了一层。所以我一直在绞尽脑汁想弄清楚如何让它发挥作用。
-
您收到该特定错误是因为 hC 未出现在该子查询的 FROM 子句中(或以其他方式可访问)。
-
您能否发布
hl_classes_terms表的定义?另外,请发布您希望结果的样子。 -
@robertb 不适用于
hl_classes_terms表...