从标有 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
是前面提到的 customId
,unit_group_number
是用于搜索丢失的 "hole" 值的列,它将作为 unused
.
我已经在这里看到了一个类似的问题(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(
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
是前面提到的 customId
,unit_group_number
是用于搜索丢失的 "hole" 值的列,它将作为 unused
.