【问题标题】:combine 3 queries to one, SELECT / COUNT / INSERT将 3 个查询合二为一,SELECT / COUNT / INSERT
【发布时间】:2020-04-30 16:41:12
【问题描述】:

我需要帮助将我的 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 |

基本上我想要实现的是我的图像服务器不会超过最大配额并崩溃,所以我想组合的 3 个查询是:

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

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】:

    连接这两个表并将其放入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 子句使它选择具有最多可用配额的服务器。

    【讨论】:

    • 嗨,Barmar,谢谢你的回答,我会试一试,肯定会超出我的 Mysql 编码技能。
    • 我想我可能有一个 MySql 错误,因为我收到一条错误消息:列 's.server_quota' in having 子句是未知的,我 100% 确定它在那里......
    【解决方案2】:

    好的,所以我遇到了一个小问题,它给了我一个错误,那就是必须将 s.server_quota 添加到 GROUP BY 才能在 HAVING 中工作

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

    再次感谢巴尔玛!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 2018-02-28
      相关资源
      最近更新 更多