Mysql 从子查询结果中选择下一行

Mysql 从子查询结果中选择下一行,mysql,Mysql,当有一个id时,很容易找到获取下一行的解决方案: SELECT MIN(id) FROM foo WHERE id > ? 但是如果我想从子查询结果中获得下一个ID(复数),该怎么办?例如: SELECT id FROM foo WHERE property > 0 此查询将返回一定数量的ID,例如:1、2、4、6。比方说,id为3的行已被删除,而行5的属性为2000000个属性组合,因此我需要最小化查询调用。一个简单的例子来说明我试图实现的目标:获取前一天下雨时的平均气温。啊,

当有一个id时,很容易找到获取下一行的解决方案:

SELECT MIN(id) FROM foo WHERE id > ?
但是如果我想从子查询结果中获得下一个ID(复数),该怎么办?例如:

SELECT id FROM foo WHERE property > 0
此查询将返回一定数量的ID,例如:
1、2、4、6
。比方说,id为
3
的行已被删除,而行
5
的属性为<0

所以我想要的是这样的结果:
2,4,5,7

问题是,我不能组合这两个查询,因为后面的查询显然返回多行


如何从子查询中获取所有下一个ID?单次查询是否可行,或者我是否需要使用过程?

我仍然不清楚您的查询,但我了解的是, 这个功能会帮助你

GROUP_CONCAT()
它将为特定列的所有行创建一个逗号分隔的列表,这样您就可以通过第一次查询获得它。 欲了解更多详情,请

访问:


如果我读对了这篇文章,您需要一个与以下内容相同的查询:

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有属性此查询的实际用途是什么?id号通常是任意的。这看起来更像是一个谜题,而不是一个真实的编程问题。原因是我只有2000行,但我要检查大约20个属性和>2000000个属性组合,因此我需要最小化查询调用。一个简单的例子来说明我试图实现的目标:获取前一天下雨时的平均气温。啊,这并不是你真正感兴趣的ID,它是一个类似于
date
的列。GROUP_CONCAT与选择符合条件的行之后的下一行有什么关系?我不清楚这个问题,但用逗号分隔的列表可以在一行中通过此函数。他没有询问如何获得逗号分隔的列表。这正是他在结果中列出所需ID的方式。感谢SpaceDog,这正是我所寻找的。不幸的是,整个方法对于我的需要来说太慢了。然而,你的答案是正确的,因此已接受:)
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
;