考虑最大正在运行的作业,仅选择等待的作业

时间:2020-10-02 10:56:50

标签: mysql

我有一个MySQL数据库表,如下所示:

CREATE TABLE IF NOT EXISTS `TIMERS` (
  `id` int(6) unsigned NOT NULL,
  `StateId` int(3) unsigned NOT NULL,
  `Job` varchar(200) NOT NULL,
  PRIMARY KEY (`id`,`StateId`)
) DEFAULT CHARSET=utf8;
INSERT INTO `TIMERS` (`id`, `StateId`, `Job`) VALUES
  ('1', '1', 'waiting job'),
  ('2', '1', 'waiting job'),
  ('3', '2', 'running job'),
  ('4', '3', 'error job'),
  ('5', '2', 'running job'),
  ('6', '4', 'other job'),
  ('7', '1', 'waiting job'),
  ('8', '1', 'waiting job'),
  ('9', '1', 'waiting job'),
  ('10', '1', 'waiting job'),
  ('11', '1', 'waiting job'),
  ('12', '1', 'waiting job'),
  ('13', '1', 'waiting job'),
  ('14', '1', 'waiting job'),
  ('15', '1', 'waiting job'),
  ('16', '1', 'waiting job'),
  ('17', '1', 'waiting job'),
  ('18', '1', 'waiting job');

该表用于执行作业,搜索新作业(bash脚本)的过程每分钟作为cronjob运行。

StateId 1 =等待的工作,StateId 2 =正在运行的工作

我的问题是,我将在运行的同时执行最多5个作业。

例如(每分钟通过cron进行bash脚本操作)

  • 3个作业的StateId为2(正在运行),现在我将仅选择接下来的2个等待的作业(最多5个)。
  • 0个作业具有StateId 2(正在运行),现在我将选择下5个等待的作业(最多5个)。

有什么主意我可以在一个MySQL SELECT语句中做到这一点吗?

我尝试使用SELECT (SUM(..))IF CASE等,但是我不知道如何在SQL语句中说:如果正在运行x个作业,请选择下一个(5-x)等待中的工作。我不知道该如何开始。

示例:FIDDLE

2 个答案:

答案 0 :(得分:2)

这将1.选择5个由StateId desc排序的作业(首先运行的作业),2.仅过滤StateId = 1,有效地选择最多5个等待的作业减去正在运行的作业。

select * from
  (select * from jobs order by StateId desc limit 5) sub
  where StateId = 1;

See the fiddle

答案 1 :(得分:0)

SELECT *
FROM ( SELECT *
       FROM jobs_tables
       ORDER BY StateId = 1 /* , CreatedAt ASC */
       LIMIT 5 ) subquery
WHERE StateId = 1

将选择0到5个等待的作业,具体取决于正在运行的作业的数量。

取消注释以选择最旧的作业。

sample fiddle