将3个查询组合为一个,SELECT / COUNT / INSERT

问题描述 投票:1回答:1

我需要帮助来将3个查询优化为一个。

我有2个表,第一个有我使用的图像处理服务器列表,因此不同的服务器可以同时处理不同的同时作业负载,因此,我有一个名为quota的字段,如下所示。

第一个表名,“ img_processing_servers”]

| id | server_url  | server_key | server_quota |
|  1 | examp.uu.co | X0X1X2XX3X |      5       |
|  2 | examp2.uu.co| X0X1X2YX3X |      3       |

第二张表将注册当前是否正在服务器上执行的作业

第二表,“ img_servers_lock”]

| id | lock_server  |      timestamp      |
|  1 |       1      | 2020-04-30 12:08:09 |
|  2 |       1      | 2020-04-30 12:08:09 |
|  3 |       1      | 2020-04-30 12:08:09 |
|  4 |       2      | 2020-04-30 12:08:09 |
|  5 |       2      | 2020-04-30 12:08:09 |
|  6 |       2      | 2020-04-30 12:08:09 |

基本上我想要实现的是我的图像服务器没有超过最大配额和崩溃,因此我想结合的三个查询是:

选择至少一台未达到配额的可用服务器,然后为其插入锁定记录。

SELECT * FROM `img_processing_servers` WHERE 

SELECT COUNT(timestamp) FROM `img_servers_lock` WHERE `lock_server` = id 

! if the count is < than quota, go ahead and register use

INSERT INTO `img_servers_lock`(`lock_server`, `timestamp`) VALUES (id_of_available_server, now())

我将如何创建此单个查询?

我的目标是确保映像服务器免受过载的影响。

mysql sql join group-by sql-insert
1个回答
1
投票

加入两个表并将其放入INSERT查询中。

INSERT INTO img_servers_lock(lock_server, timestamp)
SELECT s.id, NOW()
FROM img_processing_servers s
LEFT JOIN img_servers_lock l ON l.lock_server = s.id
GROUP BY s.id
HAVING IFNULL(COUNT(l.id), 0) < s.server_quota
ORDER BY s.server_quota - IFNULL(COUNT(l.id), 0) DESC
LIMIT 1

ORDER BY子句使它选择具有最多可用配额的服务器。

© www.soinside.com 2019 - 2024. All rights reserved.