如何选择SQL查询范围内的项目?

时间:2012-07-20 00:01:49

标签: mysql sql

我的数据库在MySQL中。

假设我有下表:

id         number
1          45
2          25
3          66
4          43
......
......
......
30         54
31         21
等等......等等。

我希望有这样的查询:

从myTable中选择*,其中number = 25

但我想再添加2个项目,一个在它上面,另一个在它下面(基于ID)。

我的查询的结果集将显示以下结果集:1,2,3。

如果我选择数字66,那么结果集将包括2,3,4等等。

我的想法是通过说,嘿,我想要ID等于1的任何东西减去这个查询的id,以及一个加上这个查询的id。

我希望这是有道理的。

任何帮助都会很棒。

谢谢!

P.S。 这一点是捕获日志中的事件,以便我可以看到在某个事件发生之前和之后发生的事情

3 个答案:

答案 0 :(得分:3)

SELECT t.*
FROM 
    myTable AS t
  JOIN
    ( SELECT id
      FROM myTable
      WHERE number = 25
    ) AS my
  ON t.id BETWEEN my.id - 1 AND my.id + 1 ;

请注意,如果您的ID有差距,会显示3行。

此外,如果您选择的number(示例中为25)出现多次(但k次),则结果将为3 * k行。


如果id列中有预期的差距,您可以使用:

SELECT *
FROM 
  ( SELECT t.*
    FROM 
        myTable AS t
      JOIN
        ( SELECT MIN(id) AS id
          FROM myTable
          WHERE number = 25
        ) AS my
      ON t.id <= my.id 
    ORDER BY t.id DESC 
      LIMIT 2
  ) AS a

UNION ALL

SELECT *
FROM
  ( SELECT t.*
    FROM 
        myTable AS t
      JOIN
        ( SELECT MIN(id) AS id
          FROM myTable
          WHERE number = 25
        ) AS my
      ON t.id > my.id 
    ORDER BY t.id ASC 
      LIMIT 1
  ) AS b ;

如果id列中存在空白且number不唯一,则参数(25)可能会出现多次(但请k次) ,你可以有一个返回3*k行的查询(几乎所有时间):

SELECT t.*
FROM 
    myTable AS t
  JOIN
    ( SELECT id
      FROM myTable
      WHERE number = 25
    ) AS ti
  ON t.id =
     ( SELECT tt.id
       FROM myTable AS tt
       WHERE tt.id < ti.id
       ORDER BY tt.id DESC
         LIMIT 1
     ) 
  OR t.id = ti.id
  OR t.id =
     ( SELECT tt.id
       FROM myTable AS tt
       WHERE tt.id > ti.id
       ORDER BY tt.id ASC
         LIMIT 1
     ) ;

答案 1 :(得分:1)

不确定它是否可行(我记得ORDER BYLIMIT UNION编辑查询有一些限制,但没有mysql实例来检查它,但是如果你尝试怎么办?

(SELECT t2.id
FROM myTable t1
INNER JOIN myTable t2 ON t2.id > t1.id
WHERE t1.number = 25
ORDER BY t2.id
LIMIT 1)

UNION ALL

(SELECT t2.id
FROM myTable t1
INNER JOIN myTable t2 ON t2.id < t1.id
WHERE t1.number = 25
ORDER BY t2.id DESC
LIMIT 1)

答案 2 :(得分:0)

SELECT * FROM table WHERE id IN (SELECT id, id-1, id+1 FROM table WHERE number=25)