我有一个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脚本操作)
有什么主意我可以在一个MySQL SELECT语句中做到这一点吗?
我尝试使用SELECT (SUM(..))
,IF CASE
等,但是我不知道如何在SQL语句中说:如果正在运行x个作业,请选择下一个(5-x)等待中的工作。我不知道该如何开始。
示例:FIDDLE
答案 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;
答案 1 :(得分:0)
SELECT *
FROM ( SELECT *
FROM jobs_tables
ORDER BY StateId = 1 /* , CreatedAt ASC */
LIMIT 5 ) subquery
WHERE StateId = 1
将选择0到5个等待的作业,具体取决于正在运行的作业的数量。
取消注释以选择最旧的作业。