Mysql SQL维护脚本

Mysql SQL维护脚本,mysql,sql,maintenance,Mysql,Sql,Maintenance,我有一张表格如下 GROUP_ID | FOO | BAR | DATETIME 我有一个cron每天晚上更新这个表。但是,我希望在脚本的最后运行一个sql命令,该命令将确保每个组id的最近50行都存在,并且删除任何其他行 例如:如果有60行GROUP_ID=1,我希望在运行此命令后只剩下最近的50行。如果只有20行的GROUP_ID=2,则将其全部保留 这在SQL中是可能的,还是我需要在PHP中实现这一点,我的大多数应用程序都是用PHP构建的 我正在运行MySQL 谢谢试试: delete

我有一张表格如下

GROUP_ID | FOO | BAR | DATETIME
我有一个cron每天晚上更新这个表。但是,我希望在脚本的最后运行一个sql命令,该命令将确保每个组id的最近50行都存在,并且删除任何其他行

例如:如果有60行GROUP_ID=1,我希望在运行此命令后只剩下最近的50行。如果只有20行的GROUP_ID=2,则将其全部保留

这在SQL中是可能的,还是我需要在PHP中实现这一点,我的大多数应用程序都是用PHP构建的

我正在运行MySQL

谢谢

试试:

delete from yourtable 
where PK in (select pk 
             from (select 
                       pk, 
                       row_number() over(partition by GROUP_ID order by GROUP_ID, activity_date) as RowNumber
                   from yourtable
                   ) dt
             where RowNumber>50
            )
编辑我刚刚看到这是针对mysql的,而不是针对ms sql的。mysql没有行号。

请尝试:

delete from yourtable 
where PK in (select pk 
             from (select 
                       pk, 
                       row_number() over(partition by GROUP_ID order by GROUP_ID, activity_date) as RowNumber
                   from yourtable
                   ) dt
             where RowNumber>50
            )
编辑我刚刚看到这是针对mysql的,而不是针对ms sql的。mysql没有行号。

试试这个大小:

DELIMITER $$
DECLARE groupCursor CURSOR FOR
SELECT GROUP_ID FROM mytable WHERE 
(SELECT COUNT(*) FROM mytable WHERE GROUP_ID=GROUP_ID) > 50;

DECLARE CONTINUE HANDLER FOR NOT FOUND done = 1;

DECLARE groupID INT;

read_loop: LOOP
FETCH groupCursor INTO groupID;
IF done THEN
   LEAVE read_loop;
ELSE
   DELETE FROM mytable
   WHERE GROUP_ID = groupID
   AND DATETIME < (SELECT MIN(DATETIME) FROM mytable WHERE GROUP_ID=groupID 
   ORDER BY DATETIME DESC LIMIT 50)
END IF;
END LOOP;
CLOSE groupCursor$$
DELIMITER ;
根据下面的讨论进行更新,这里是一个存储过程创建脚本,它应该没有语法错误

-- --------------------------------------------------------------------------------
-- Routine DDL
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `mydb`.`maintenanceTaskDelete` ()
BEGIN

DECLARE groupCursor CURSOR FOR SELECT GROUP_ID FROM mytable;
DECLARE done BIT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

DECLARE groupID INT;

read_loop: LOOP
FETCH groupCursor INTO groupID;
IF done THEN
   LEAVE read_loop;
ELSE
   DELETE FROM mytable
   WHERE GROUP_ID = groupID
   AND DATETIME < (SELECT MIN(DATETIME) FROM mytable WHERE GROUP_ID=groupID 
   ORDER BY DATETIME DESC LIMIT 50);
END IF;
END LOOP;
CLOSE groupCursor;

END$$
要调用例程,只需执行以下操作: 调用maintenanceTaskDelete

试试这个尺码:

DELIMITER $$
DECLARE groupCursor CURSOR FOR
SELECT GROUP_ID FROM mytable WHERE 
(SELECT COUNT(*) FROM mytable WHERE GROUP_ID=GROUP_ID) > 50;

DECLARE CONTINUE HANDLER FOR NOT FOUND done = 1;

DECLARE groupID INT;

read_loop: LOOP
FETCH groupCursor INTO groupID;
IF done THEN
   LEAVE read_loop;
ELSE
   DELETE FROM mytable
   WHERE GROUP_ID = groupID
   AND DATETIME < (SELECT MIN(DATETIME) FROM mytable WHERE GROUP_ID=groupID 
   ORDER BY DATETIME DESC LIMIT 50)
END IF;
END LOOP;
CLOSE groupCursor$$
DELIMITER ;
根据下面的讨论进行更新,这里是一个存储过程创建脚本,它应该没有语法错误

-- --------------------------------------------------------------------------------
-- Routine DDL
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `mydb`.`maintenanceTaskDelete` ()
BEGIN

DECLARE groupCursor CURSOR FOR SELECT GROUP_ID FROM mytable;
DECLARE done BIT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

DECLARE groupID INT;

read_loop: LOOP
FETCH groupCursor INTO groupID;
IF done THEN
   LEAVE read_loop;
ELSE
   DELETE FROM mytable
   WHERE GROUP_ID = groupID
   AND DATETIME < (SELECT MIN(DATETIME) FROM mytable WHERE GROUP_ID=groupID 
   ORDER BY DATETIME DESC LIMIT 50);
END IF;
END LOOP;
CLOSE groupCursor;

END$$
要调用例程,只需执行以下操作:
调用maintenanceTaskDelete

MySQL中未定义行\u编号。。。如果我没有弄错的话,那就是阿莱克斯·安吉利尼女士,如果可能的话,我会删除这个答案。我不确定我在想什么,MySql多次出现在这个问题中。MySql中没有定义行数。。。如果我没有弄错的话,那就是阿莱克斯·安吉利尼女士,如果可能的话,我会删除这个答案。我不确定我在想什么,MySql多次出现在这个问题上。这是比我做过的更高级的SQL,我有点了解发生了什么,尽管当我把它放到MySql Workbench中时,所有声明都突出显示为红色,它在第一行就抛出了一个错误。我刚刚在响应中更新了我的脚本。如果您仍然收到语法错误,请告诉我。它的版本是:5.0.77,它仍然在第一次声明时抛出错误您可能必须将上述所有代码放入MySQL Workbench中的存储过程例程并调用该例程。即使在例程中,它说第一次声明是一个语法错误这是比我以前做过的更高级的SQL,并且我有点了解发生了什么,虽然当我将其放入MySQL Workbench时,所有声明都以红色突出显示,并在第一行抛出一个错误,但我刚刚在响应中更新了脚本。如果您仍然收到语法错误,请告诉我。它是版本:5.0.77,它仍然在第一次声明时抛出错误。您可能必须将上述所有代码放入MySQL Workbench中的存储过程例程并调用该例程。即使在例程中,它也会说第一次声明是语法错误