Mysql 我想优化这个SQL查询

Mysql 我想优化这个SQL查询,mysql,Mysql,我有这样的疑问: DELIMITER $$ USE `kpbaru`$$ DROP PROCEDURE IF EXISTS `getAllUmurPegawai`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `getAllUmurPegawai`(IN id_user VARCHAR(20),i_tahun INT) BEGIN DECLARE currdate INT; DECLARE birthdate INT;

我有这样的疑问:

DELIMITER $$

USE `kpbaru`$$

DROP PROCEDURE IF EXISTS `getAllUmurPegawai`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `getAllUmurPegawai`(IN id_user VARCHAR(20),i_tahun INT)
BEGIN
    DECLARE currdate INT;
    DECLARE birthdate INT;
    DECLARE numRows INT;
    DECLARE numIteration INT;
    DECLARE tempMonth INT;
    DECLARE umur INT;
    SET numRows = (SELECT COUNT(*) FROM pegawai);
    SET numIteration = 1;

    WHILE numIteration <= numRows DO
        SET currdate = i_tahun; 
        SET birthdate = (SELECT EXTRACT(YEAR FROM (SELECT TGL_LAHIR FROM pegawai WHERE INDEXING = numIteration AND ID_USER=id_user)));
        SET umur = currdate - birthdate;
        SET tempMonth = (SELECT EXTRACT(MONTH FROM (SELECT TGL_LAHIR FROM pegawai WHERE INDEXING = numIteration AND ID_USER=id_user)));
        IF umur < 56 THEN
            UPDATE pegawai SET pegawai.STATUS_PEGAWAI='Belum Pensiun',pegawai.BULAN_PENSIUN=tempMonth,STATUS_PENSIUN=1 WHERE pegawai.INDEXING = numIteration AND ID_USER=id_user;
        ELSE 
            IF umur = 56 THEN
                UPDATE pegawai SET pegawai.STATUS_PEGAWAI='Pensiun',pegawai.BULAN_PENSIUN=tempMonth,STATUS_PENSIUN=1 WHERE pegawai.INDEXING = numIteration AND ID_USER=id_user;
            ELSE 
                UPDATE pegawai SET pegawai.STATUS_PEGAWAI='Pensiun',pegawai.BULAN_PENSIUN=tempMonth,STATUS_PENSIUN=0 WHERE pegawai.INDEXING = numIteration AND ID_USER=id_user; 
            END IF;
        END IF;
        SET numIteration = numIteration + 1;
    END WHILE;
END$$

DELIMITER ;
UPDATE pegawai AS p LEFT JOIN(SELECT INDEXING, CAST(CASE WHEN (i_tahun - EXTRACT(YEAR FROM(SELECT TGL_lAHIR FROM pegawai WHERE ID_USER=id_user))) < 56 THEN 'Belum Pensiun' ELSE 'Pensiun' END AS VARCHAR(20))AS statusPegawai, EXTRACT(MONTH FROM(SELECT TGL_LAHIR FROM pegawai WHERE ID_USER=id_user))AS bulanPensiun, CAST(CASE WHEN (i_tahun - EXTRACT(YEAR FROM(SELECT TGL_lAHIR FROM pegawai WHERE ID_USER=id_user))) <= 56 THEN 1 ELSE 0 END AS INT)AS statusPensiun FROM pegawai WHERE ID_USER=id_user GROUP BY INDEXING)AS m
    ON p.ID_USER = m.ID_USER
    SET p.STATUS_PEGAWAI = m.statusPegawai, p.BULAN_PENSIUN = m.bulanPensiun, p.STATUS_PENSIUN = m.statusPensiun
    WHERE p.ID_USER = id_user;
错误代码:1064 您的SQL语法有错误;查看与MySQL服务器版本对应的手册,了解第29行“varchar20as statusPegawai,extractmonth from select TGL_LAHIR from pegawai w”附近使用的正确语法

我们将感谢您的解决方案!:D

您不能强制转换为varchar,而是使用char


如果我正确地阅读了您的查询,我认为您可以在单个更新语句中为用户执行此操作:-

UPDATE pegawai
SET STATUS_PEGAWAI = IF(i_tahun - YEAR(TGL_LAHIR) < 56, 'Belum Pensiun', 'Pensiun'),
BULAN_PENSIUN = MONTH(TGL_LAHIR),
STATUS_PENSIUN = IF(i_tahun - YEAR(TGL_LAHIR) <= 56, 1, 0)
WHERE ID_USER=id_user

我已将其转换为charn,但仍有以下错误消息:Query:CREATE DEFINER=root@localhost过程getAllUmurPegawaiin id\u user varchar20,i\u tahun int BEGIN DECLARE currdate int;。。。错误代码:1064您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解使用第28行“intAS StatusPensun from pegawai where ID_USER=ID_USER group by INDEXINGas m”的正确语法,或者您有任何优化我的查询的解决方案吗?正如您在我的回答中所看到的,这也是不允许的。改为使用signedor unsigned。您的一个子查询返回了多行Jens 9分钟前哪个子查询Jens?如果不了解您的数据库,我不能这么说。我可以优化循环部分Kickstart吗?我必须更新员工的每个年龄段,我的数据库中有4000名员工。。如何加快更新速度?:D谢谢你的回答上面的代码应该消除了对循环的需要。如果要为所有用户执行此操作,只需删除WHERE子句。恐怕我无法测试它,因为您尚未发布表声明或任何示例数据。
The CONVERT() and CAST() functions take an expression of any type and produce a result value of a specified type. 

The type for the result can be one of the following values: 

- BINARY[(N)]

- CHAR[(N)]

- DATE

- DATETIME

- DECIMAL[(M[,D])]

- SIGNED [INTEGER]

- TIME

- UNSIGNED [INTEGER] 
UPDATE pegawai
SET STATUS_PEGAWAI = IF(i_tahun - YEAR(TGL_LAHIR) < 56, 'Belum Pensiun', 'Pensiun'),
BULAN_PENSIUN = MONTH(TGL_LAHIR),
STATUS_PENSIUN = IF(i_tahun - YEAR(TGL_LAHIR) <= 56, 1, 0)
WHERE ID_USER=id_user