Mysql 返回所需ID上方2行和下方2行
我在堆栈上找到了这个问题的一些答案,但没有一个有效。我可以说我相当了解mysql,但还不足以让它工作 这张桌子是这样的:Mysql 返回所需ID上方2行和下方2行,mysql,Mysql,我在堆栈上找到了这个问题的一些答案,但没有一个有效。我可以说我相当了解mysql,但还不足以让它工作 这张桌子是这样的: id | Name | Sales ---|------|------ 0 | Tim | 9 1 | Jim | 5 2 | Joe | 3 3 | Ryan | 6 4 | Phil | 7 5 | James| 1 请注意,ID-s在将来可能不符合顺序,因此它可能是1、4、10、11、12等,仍然是唯一的,但由于用户删除一些内容并添加其他内容,因此不
id | Name | Sales
---|------|------
0 | Tim | 9
1 | Jim | 5
2 | Joe | 3
3 | Ryan | 6
4 | Phil | 7
5 | James| 1
请注意,ID-s在将来可能不符合顺序,因此它可能是1、4、10、11、12等,仍然是唯一的,但由于用户删除一些内容并添加其他内容,因此不会像+1那样递增
现在我想选择和标识示例3,并获取上面和下面的两行。如果ID为0,则选择0下方的4行,因此始终选择5行
我的天啊,我好笨。我不需要按ID上下选择两行,而是按销售人员选择。但是仍然需要根据销售情况从特定ID bud上下排列。对不起大家。但我仍然需要帮助 如果要按id顺序执行此操作,则有点棘手,因为条件是始终获取4行。这里有一个方法。这个想法是在id之前选择最多4个,在id之后选择最多4个,以及id本身。然后,使用MySQL变量枚举行 最后一次选择选择枚举值0、1和2。这应该正好产生5行:
select t.*
from ((select t.*, @rn1 := @rn1 + 1 as rn
from t cross join
(select @rn1 := 0) const
where id < MYID
order by id desc
limit 4
) union all
(select t.*, @rn2 := @rn2 + 1 as rn
from t cross join
(select @rn2 := 0) const
where id > MYID
order by id
limit 4
) union all
(select t.*, 0 as rn
from t
where id = MYID
)
) t
where rn <= 2;
请阅读文档: 以下是一个例子: (SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
根据你的需要改变它 假设您要提取5个id,它们接近id 12。您可以通过减法计算到所需id的距离,并使用进行排序
SELECT ABS(12-10) => 2
SELECT ABS(12-11) => 1
SELECT ABS(12-12) => 0
SELECT ABS(12-13) => 1
SELECT ABS(12-14) => 2
例如,一个查询将5行按距离排序的id拉到所需的id 12,可以如下所示:
SELECT * FROM `test_table` ORDER BY ABS(12-CAST(`id` AS SIGNED)) LIMIT 5
注意:此技术将根据ID的数量而变慢,因为所有ID都将被排序。在debian、Intel Xeon 2.4Ghz、4gb ram上测试了10万行,查询速度约为0.11秒
要保持较大表的性能,请使用WHERE子句限制要排序的行数:
WHERE id BETWEEN (desired id - 1000) AND (desired id + 1000)
您使用的是什么SQL查询?你能举一个精确输入和输出的例子吗?你试过按ID排序吗?SQL表本质上是无序的,所以在给定的行之前或之后没有行的定义。你可以通过小于或大于给定id的两个id做你想做的事情,但不能通过行。我认为StackOverflow不是说RTFM,而是一个用户可以互相帮助的平台。虽然这个答案确实指向了正确的方向,但它也可以包括一个与老年退休金问题相匹配的例子。谢谢你的评论。我确信我的答案包含了相应的例子。