我有一个看起来像这样的表:
id | serial_number_basic | product_id
-------------------------------------
serial_number_basic 是一个流水号,每次需要新号码时都会累加。过去,可以将该数字的整个范围留空,下一个数字是 MAX() + 1
。
由于要求的变化,现在需要填补空洞。 serial_number_basic 当然取决于 product_id。每个产品都有自己的 serial_number_basics 序列。问题是找到漏洞。
这个查询确实根据每个 [productid] 找到了漏洞,但不幸的是它太慢了:
SELECT (
MIN( serial_number_basic ) + 1
) as next_available_box
FROM (
SELECT DISTINCT t0.serial_number_basic, t1.serial_number_basic AS number_plus_one
FROM (SELECT * FROM conv WHERE product_id = [productid]) AS t0
LEFT JOIN
(SELECT * FROM conv WHERE product_id = [productid]) AS t1
ON t0.serial_number_basic + 1 = t1.serial_number_basic
) AS sub
WHERE number_plus_one IS NULL;
最佳答案
没有任何聚合,没有order-by,只是一个简单的外连接,试试:
SELECT MIN(c1.serial_number_basic) + 1
FROM conv c1
LEFT JOIN conv c2
ON c2.serial_number_basic = c1.serial_number_basic+1
AND c2.product_id = c1.product_id
WHERE c1.product_id = 2
AND c2.id IS null
关于mysql - 优化慢速查询以查找序列中的漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6708245/