如果我没看错,您需要一个与以下内容相同的查询:
SELECT MIN(id) FROM foo WHERE id > ?
但是对于多个ID。因此,对于给定的 id 列表,您可以按顺序获得下一个现有 id。这似乎有点奇怪,我感觉您尝试实现的功能可能会以不同的方式实现。我还假设您有充分的理由不能只获取整个表并在使用数据的任何代码中找到正确的 id。
话虽如此,是的,它可以做到。您已经有了获取正确“下一个”ID 的查询,因此您可以将表与自身连接以创建一个具有两个 id 列的表,一个是原始 ID,另一个是“下一个”ID。然后,您可以根据您拥有的原始 ID 列表过滤该表并返回另一个 ID。像那样:
SELECT f1.id AS id
FROM foo f1, foo f2
WHERE f1.id =
( SELECT MIN( f3.id ) FROM foo f3 WHERE f3.id > f2.id )
AND f2.id IN ( 1, 2, 4, 6 )
;
在我的系统上,如果我按照您的描述设置表,则返回 2、4、5、7(没有 id 3、5 和 7 的属性 <= 0)。
对于大量数据,该查询可能不是最快的。
我认为这就是您想要做的,正如developerCK所说,GROUP_CONCAT
如果您需要将property > 0
查询结果输入此查询,您可以使用。但是,如果这就是您想要做的,您可以跳过中间人并像这样组合查询:
SELECT f1.id AS id
FROM foo f1, foo f2
WHERE f1.id =
( SELECT MIN( f3.id ) FROM foo f3 WHERE f3.id > f2.id )
AND f2.property > 0
;