0

我的数据库在 MySQL 中。

假设我有下表:

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

等等……等等。

我想要这样的查询:

select * from myTable where number = 25

但我还想再包括 2 个项目,一个在它上面,一个在它下面(基于 ID)。

我的查询的结果集将出现以下结果集:1、2、3。

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

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

我希望这是有道理的。

任何帮助都会很棒。

谢谢!

PS 这样做的目的是在日志中捕获事件,以便我可以看到某个事件发生之前和之后发生的事情

4

3 回答 3

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
     ) ;
于 2012-07-20T00:05:32.273 回答
1

不确定它是否会起作用(我记得对ORDER BYLIMITin UNIONed 查询有一些限制,但没有 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)
于 2012-07-20T00:11:32.947 回答
0
SELECT * FROM table WHERE id IN (SELECT id, id-1, id+1 FROM table WHERE number=25)
于 2012-07-20T00:04:35.720 回答