Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql优先排序使用字段 学生表: 课程表:_Mysql - Fatal编程技术网

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