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

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

我有一个与[[Mysql相关的问题,我对基本知识没问题,但我需要帮助将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
1个回答
0
投票
加入两个表并将其放入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.