从标有 id 和 customId 的行集合中查找最小未使用值

Find minimum non-used value from collection of rows marked with an id and customId

我已经在这里看到了一个类似的问题(Get minimum unused value in MySQL column)这正是我想要的,除了我需要 select 最小可用数量不仅仅是来自 table 而是来自具有特定 customId 的行也是如此。 如果其他问题被删除或其他问题,这里是需要查询的内容:

如果行 [1,2,3],查询应该 return 4.

如果行 [2,3,4],查询应该 return 1.

如果行 [1,3,4],查询应该 return 2.

如果有多个缺失行 [1,2,4,6,7] 查询应该 return 最小缺失值 3.

我尝试了第一个 linked 问题和这个 link() 中显示的解决方案。我尝试调整它们以将 customId 包含在 WHERE 子句中,但查询对我来说太高级且令人困惑,因此它不起作用。我试过这样做:

  SELECT min(unused) AS unused
  FROM (
  SELECT MIN(t1.id)+1 as unused
  FROM yourTable AS t1
  WHERE t1.customId = ? AND NOT EXISTS (SELECT * FROM yourTable AS t2 WHERE t2.customId = ? 
   AND t2.id = t1.id+1)
  UNION
  -- Special case for missing the first row
  SELECT 1
  FROM DUAL
    WHERE customId = ? AND NOT EXISTS (SELECT * FROM yourTable WHERE id = 1)

  )AS subquery

但它显示访问或语法冲突错误。

你可以这样做:

select 1 + min(col)
from t
where not exists (select 1 from t t2 where t2.col = t.col + 1);

如果您需要包含“1”,则:

select (case when min(tt.mincol) <> 1 then 1
             else 1 + min(col)
        end)
from t cross join
     (select min(col) as mincol from t) tt
where not exists (select 1 from t t2 where t2.col = t.col + 1)

我调整了我在网上找到的一个查询,直到它起作用...显然它不一定很快或性能很好,但它起作用了,所以这里是:

SELECT min(unused) AS unused FROM
  ( SELECT MIN(t1.group_number)+1 as unused FROM units AS t1 WHERE t1.user_id = '.$ai_id.' AND 
     NOT EXISTS (SELECT * FROM units AS t2 WHERE t2.user_id = '.$ai_id.' AND t2.group_number= 
   t1.group_number +1) UNION
    -- Special case for missing the first row 
    SELECT 1 FROM DUAL WHERE NOT EXISTS (SELECT * FROM units  WHERE  group_number= 1 
    AND user_id = '.$ai_id.') )AS subquery

我不确定它到底是如何工作的,但不知何故,我只能得到轮廓... 本例中的 user_id 是前面提到的 customIdunit_group_number 是用于搜索丢失的 "hole" 值的列,它将作为 unused.