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

时间:2013-09-08 00:57:48

标签: mysql

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

SELECT MIN(id) FROM foo WHERE id > ?

但是,如果我想从子查询结果中获得下一个id(复数)怎么办? E.g:

SELECT id FROM foo WHERE property > 0

此查询将返回一定数量的ID,例如:1, 2, 4, 6。可以说,标识为3的行已被删除,行5的属性为< 2, 4, 5, 7。 0

所以我想要的是这样的结果:{{1}}。

问题是,我无法将这两个查询结合起来,因为后者显然会返回多行。

我如何从子查询中获取所有下一个ID?是可以使用单个查询还是需要使用过程?

2 个答案:

答案 0 :(得分:1)

如果我正确阅读,您需要一个与以下内容相同的查询:

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
;

答案 1 :(得分:-1)

我仍然不清楚你的查询,但我的理解是, 这个功能可以帮到你,

GROUP_CONCAT()

它将为特定列的所有行创建逗号分隔列表,以便您可以使用第一个查询获取它。 有关此pls的更多详细信息

访问:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

http://www.w3resource.com/mysql/aggregate-functions-and-grouping/aggregate-functions-and-grouping-group_concat.php