我的数据库在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。 这一点是捕获日志中的事件,以便我可以看到在某个事件发生之前和之后发生的事情
答案 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 BY
和LIMIT
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)