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

时间:2018-09-03 08:48:00

标签: mysql

我有此sql查询,该查询在mysql服务器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服务器版本相对应的手册   在'from [select k.sID,concat(s.surName,'',   s.firstName,'',s.oNames)作为第1行的AS'FName'

每次我尝试运行它

2 个答案:

答案 0 :(得分:1)

RANK是从MYSQL 8.0.2(升级到的版本)开始的保留字。这就是为什么您得到错误的原因。

要解决此问题,只需在RANK周围添加反引号`。

您可以找到更多详细信息here 在尝试读取mysql错误消息时,您应该始终查看消息从何处开始之前的

答案 1 :(得分:0)

我尝试修复一些我遇到的语法错误,从而掠过了您的代码。不知道它是否会起作用,但这至少是一个开始。

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

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;

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