MySql优先排序使用字段 学生表: 课程表:
从上面两个表中,我试图根据课程表中的级别获取最新的用户记录。该级别应匹配,以便以相同的顺序检查当前、完成和跳过的级别,因此,如果用户对任何课程类型具有当前级别,则应获取该级别,否则请检查完成的级别 我正在使用以下查询MySql优先排序使用字段 学生表: 课程表:,mysql,Mysql,从上面两个表中,我试图根据课程表中的级别获取最新的用户记录。该级别应匹配,以便以相同的顺序检查当前、完成和跳过的级别,因此,如果用户对任何课程类型具有当前级别,则应获取该级别,否则请检查完成的级别 我正在使用以下查询 SELECT `sc`.`student_id`, `s`.`name`, `sc`.`id` as `course_id`, `sc`.`ctype`, `sc`.`level`, FROM `course
SELECT `sc`.`student_id`,
`s`.`name`,
`sc`.`id` as `course_id`,
`sc`.`ctype`,
`sc`.`level`,
FROM `course` `sc`
LEFT JOIN `students` `s` ON `s`.`id` = `sc`.`student_id`
WHERE sc.id = (SELECT ssc.id FROM course ssc WHERE ssc.student_id = sc.student_id
ORDER BY FIELD(`ssc`.`level`,"current","complete","skipped") DESC LIMIT 1,1)
GROUP BY `sc`.`student_id`
ORDER BY `sc`.`id` DESC
LIMIT 20
上述查询的问题是,仅当课程表中有多个用户id匹配时才会显示。所以我得到的最终输出是,它只显示id为2的学生,忽略id为1的学生,因为只有一个
查询结果表
预期结果
注意:我还尝试了设置中的字段,而不是字段中的字段,得到了相同的结果将
限制1,1
更改为限制0,1
或只是限制1
与SQL中的大多数其他内容不同,LIMIT
子句中的offset
字段是基于0的,而不是基于1的。因此,如果只有1个匹配行,LIMIT 1,1
跳过它。如果有两行或更多匹配行,则不是第一行,而是第二行
此外,排序应该是ASC
,而不是DESC
,因为您希望选择最低的字段(current
),而不是最高的字段
SELECT `sc`.`student_id`,
`s`.`name`,
`sc`.`id` as `course_id`,
`sc`.`ctype`,
`sc`.`level`
FROM `course` `sc`
LEFT JOIN `students` `s` ON `s`.`id` = `sc`.`student_id`
WHERE sc.id = (
SELECT ssc.id FROM course ssc
WHERE ssc.student_id = sc.student_id
ORDER BY FIELD(`ssc`.`level`,"current","complete","skipped") ASC
LIMIT 0,1)
GROUP BY `sc`.`student_id`
ORDER BY `sc`.`id` DESC
LIMIT 20
也不需要
分组依据
sc
student\u id`。查询只为每个学生返回一个课程ID,因此每个学生不能有多行。如果课程表中有多个匹配的学生ID,结果将按预期显示,则仍然相同。已更新答案。您需要修复LIMIT
子句。如果我确实限制了0,1或LIMT 1,则首选项将被忽略,查询将获取每个学生的最新课程。您还需要将顺序从DESC
更改为ASC
,因为您希望字段的数字最小。
SELECT `sc`.`student_id`,
`s`.`name`,
`sc`.`id` as `course_id`,
`sc`.`ctype`,
`sc`.`level`,
FROM `course` `sc`
LEFT JOIN `students` `s` ON `s`.`id` = `sc`.`student_id`
WHERE sc.id = (SELECT ssc.id FROM course ssc WHERE ssc.student_id = sc.student_id
ORDER BY FIELD(`ssc`.`level`,"current","complete","skipped") DESC LIMIT 1,1)
GROUP BY `sc`.`student_id`
ORDER BY `sc`.`id` DESC
LIMIT 20
student_id | name | course_id | ctype | level |
=====================================================
2 | Name 2 | 2 | advanced | current
student_id | name | course_id | ctype | level |
=====================================================
2 | Name 2 | 2 | advanced | current
1 | Name 1 | 3 | beginner | current
SELECT `sc`.`student_id`,
`s`.`name`,
`sc`.`id` as `course_id`,
`sc`.`ctype`,
`sc`.`level`
FROM `course` `sc`
LEFT JOIN `students` `s` ON `s`.`id` = `sc`.`student_id`
WHERE sc.id = (
SELECT ssc.id FROM course ssc
WHERE ssc.student_id = sc.student_id
ORDER BY FIELD(`ssc`.`level`,"current","complete","skipped") ASC
LIMIT 0,1)
GROUP BY `sc`.`student_id`
ORDER BY `sc`.`id` DESC
LIMIT 20