查询语法问题从5.7升级到mysql 8

查询语法问题从5.7升级到mysql 8,mysql,Mysql,我有一个sql查询,它在mysql server 5.7中工作,但在升级到8.0.12版后将无法工作 SELECT sID, FNames, total, grade, h_score, l_score, stud_per_sub, RANK FROM (SELECT k.sID, concat(s.surName,' ', s.firstName,' ', s.oNames) AS 'FNames', k.total, k.h_score, k.stud_per_sub, k.l_sc

我有一个sql查询,它在mysql server 5.7中工作,但在升级到8.0.12版后将无法工作

SELECT sID, FNames, total, grade, h_score, l_score, stud_per_sub, RANK FROM 
(SELECT k.sID, concat(s.surName,'  ', s.firstName,'  ', s.oNames) AS 
'FNames', k.total, k.h_score, k.stud_per_sub, k.l_score, k.grade, @curRank 
:= if(@prevRank = k.total, @curRank, @incRank) AS rank, @incRank := @incRank 
+ 1, @prevRank := k.total FROM terminal_assessment k LEFT JOIN student s ON 
(s.studentID = k.sID), (SELECT @curRank := 0, @prevRank := null, @incRank := 
1) r WHERE k.subj_TeacherID=:sid AND k.session=:sess AND k.classID=:cid AND 
k.term=:trm AND k.subid=:subject ORDER BY k.total desc) AS m;
它给出了这个错误消息

(错误代码:1064。您的SQL语法有错误;请检查 与右边的MySQL服务器版本相对应的手册 使用near'from[选择k.sID,concat(s.姓氏, s、 firstName,,,s.oNames)在第1行中作为“FName”


每次我试着运行它时,我都试图修复我遇到的一些语法错误,浏览你的代码。不确定它是否能正常工作,但至少这是一个开始

您还应该格式化/缩进代码,使其更易于阅读。这也将使调试更容易,因为控制台将准确地告诉您正确格式化示例中的问题所在

SELECT
    m.sID, 
    m.FNames,
    m.total,
    m.grade,
    m.h_score,
    m.l_score,
    m.stud_per_sub,
    m.`RANK`
FROM 
(
    SELECT
        k.sID,
        concat(s.surName,'  ', s.firstName,'  ', s.oNames) AS FNames,
        k.total,
        k.h_score,
        k.stud_per_sub,
        k.l_score,
        k.grade,
        @curRank  := if(@prevRank = k.total, @curRank, @incRank) AS `RANK`,
        @incRank  := @incRank + 1,
        @prevRank := k.total
    FROM
        terminal_assessment k
    LEFT JOIN
        student s ON
        (s.studentID = k.sID),
        (SELECT @curRank := 0, @prevRank := null, @incRank := 1) r 
    WHERE 
        @sid     := k.subj_TeacherID
    AND @sess    := k.session
    AND @cid     := k.classID
    AND @trm     := k.term
    AND @subject := k.subid
    ORDER BY k.total desc
) AS m;

使用此工具,我至少没有收到任何语法错误。

我尝试修复遇到的一些语法错误,浏览了您的代码。不确定它是否能正常工作,但这至少是一个开始

您还应该格式化/缩进代码,使其更易于阅读。这也将使调试更容易,因为控制台将准确地告诉您正确格式化示例中的问题所在

SELECT
    m.sID, 
    m.FNames,
    m.total,
    m.grade,
    m.h_score,
    m.l_score,
    m.stud_per_sub,
    m.`RANK`
FROM 
(
    SELECT
        k.sID,
        concat(s.surName,'  ', s.firstName,'  ', s.oNames) AS FNames,
        k.total,
        k.h_score,
        k.stud_per_sub,
        k.l_score,
        k.grade,
        @curRank  := if(@prevRank = k.total, @curRank, @incRank) AS `RANK`,
        @incRank  := @incRank + 1,
        @prevRank := k.total
    FROM
        terminal_assessment k
    LEFT JOIN
        student s ON
        (s.studentID = k.sID),
        (SELECT @curRank := 0, @prevRank := null, @incRank := 1) r 
    WHERE 
        @sid     := k.subj_TeacherID
    AND @sess    := k.session
    AND @cid     := k.classID
    AND @trm     := k.term
    AND @subject := k.subid
    ORDER BY k.total desc
) AS m;

我至少没有发现任何语法错误。RANK是一个从MYSQL 8.0.2(您升级到的版本)开始的保留字。这就是出现错误的原因

解决这个问题很简单,只需在秩周围添加反勾号即可

你可以找到更多的细节
在尝试读取mysql错误消息时,您应该始终查看消息起始点之前的内容。RANK是从mysql 8.0.2(您升级到的版本)开始的保留字。这就是出现错误的原因

解决这个问题很简单,只需在秩周围添加反勾号即可

你可以找到更多的细节
在尝试读取mysql错误消息时,您应该始终查看消息起始点之前的内容

尝试从FNames中删除单引号标记。@Martin ok我会更正的,尝试从FNames中删除单引号标记。@Martin ok我会更正的,我刚刚尝试了与您建议的格式相同的代码,但仍然存在问题mysql workbench中也会出现同样的错误。请尝试更新后的答案,看看@LoveJESUS是否仍会出现同样的错误。我的工作台中没有任何语法错误,只是该表不存在等等。因此,这应该是一个开始。我已经包含了您编辑的代码,并且不再给出初始错误消息。但是,唯一的挑战是现在,它没有从数据库中得到它应该得到的任何记录。@MartinI只是用你建议的格式尝试了你的代码,但在mysql workbench中仍然得到相同的错误。尝试更新的答案,看看你是否仍然得到相同的错误@LoveJESUS。我的工作台中没有任何语法错误,只是表不存在等等。所以这应该是一个开始。我现在已经包含了您编辑的代码,它不再给出初始错误消息。但是,现在唯一的挑战是它没有从数据库中获得任何它应该得到的记录。@MartinCorrect answer@LelioThanks for help@LelioThank you@LelioCorrect answer@LelioThanks for help@LelioThank you@Lelio