mysql - 我想优化这个 SQL 查询

标签 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;
    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 ;

我想优化这个查询,因为这个查询将搜索每个人的每个年龄。如果我们有大数据(> 1000 行),此查询运行速度会非常慢。有人知道如何优化吗?

我尝试过这样的查询:

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;

但还是错了。这里的错误是:

查询:

CREATE DEFINER=`root`@`localhost` PROCEDURE `getAllUmurPegawai`(in id_user varchar(20),i_tahun int) BEGIN  DECLARE currdate INT;...

Error Code : 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'varchar(20))as statusPegawai, extract(month from(select TGL_LAHIR from pegawai w' at line 29

解决方案将不胜感激! :D

最佳答案

您无法转换为 varchar,请改用 char

来自mysql documentation

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] 

关于mysql - 我想优化这个 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25499226/

相关文章:

mysql - 使用 Mysql 处理时区

mysql - 将新行插入到连接到数据库上另一个表的表中

mysql - 在 MySQL 中创建触发器时出错

sql - 单租户、多应用数据库设计?

php - 仅当另一个表中的 id 存在时才插入行

mysql - 如何根据条件获取别名字段的 SUM?

Mysql:如何查看 mysql 二进制文件的编译时配置

C# - 如何在 C# 中使用整数来确定从 mysql 表中选择的限制

php - MYSQL 需要帮助使用 php 从每个 "user"中提取数据

sql - MySQL:联合、计数和分组依据