4

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

SELECT MIN(id) FROM foo WHERE id > ?

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

SELECT id FROM foo WHERE property > 0

此查询将返回一定数量的 id,例如:1, 2, 4, 6。假设 id 的行3已经被删除,并且 row 的属性5< 0。

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

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

如何从子查询中获取所有下一个 id?是否可以通过单个查询或我需要使用程序?

4

2 回答 2

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
;
于 2013-09-08T04:57:45.930 回答
-1

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

GROUP_CONCAT()

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

访问: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

于 2013-09-08T03:37:55.910 回答