繁体   English   中英

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

[英]Select next rows from subquery result

当有一个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? 是可以使用单个查询还是需要使用过程?

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

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
;

我仍然不清楚你的查询,但我明白,这个功能会帮助你,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM