首页 > 解决方案 > 如何在 SELECT 语句中修复 MySQL 中的语法错误

问题描述

从第 8 行的 SELECT 语句开始出现语法错误。不知道为什么。有任何想法吗?请参阅错误开始的代码中的注释。

我认为这可能与第二次引用 Login la 有关,但是当我尝试将其更改为 Login o 时,我仍然遇到同样的错误。

    CREATE PROCEDURE setAttendance(IN _sectionid integer, IN _studentid integer, IN _logindate datetime, IN _result integer)

BEGIN

UPDATE Login l
INNER JOIN Roll r ON l.rollid = r.tid
SET result = _result
WHERE
r.sectionid = _sectionid AND r.studentid = _studentid 
AND DATE(logindate) = DATE(_logindate);

//error starts here and ends on line after it
SELECT tid FROM Login l
INNER JOIN Roll r ON l.rollid = r.tid
WHERE
r.sectionid = _sectionid AND r.studentid = _studentid 
AND DATE(logindate) = DATE(_logindate);

我只想在没有语法错误的情况下运行它

标签: mysqlsql

解决方案


这个问题通常是由于缺少DELIMITER,但我也建议简化日期算术,以便它对索引更友好并限定所有列名:

DELIMITER $$

CREATE PROCEDURE setAttendance (
    IN _sectionid integer,
    IN _studentid integer,
    IN _logindate datetime,
    IN _result integer
)
BEGIN

    UPDATE Login l INNER JOIN
           Roll r
           ON l.rollid = r.tid
        SET result = _result
    WHERE r.sectionid = _sectionid AND 
          r.studentid = _studentid AND
          ?.logindate >= DATE(_logindate) AND   -- the ? is for the table alias
          ?.logindate < DATE(_logindate) + INTERVAL 1 DAY;


    //error starts here and ends on line after it

    SELECT r.tid    -- table alias
    FROM Login l INNER JOIN 
         Roll r
         ON l.rollid = r.tid
    WHERE r.sectionid = _sectionid AND
          r.studentid = _studentid AND
          ?.logindate >= DATE(_logindate) AND   -- the ? is for the table alias
          ?.logindate < DATE(_logindate) + INTERVAL 1 DAY;
END; $$

DELIMITER ;

请注意,问号是为了让您包含适当的表别名。限定所有列名。


推荐阅读