Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 返回所需ID上方2行和下方2行_Mysql - Fatal编程技术网

Mysql 返回所需ID上方2行和下方2行

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等,仍然是唯一的,但由于用户删除一些内容并添加其他内容,因此不

我在堆栈上找到了这个问题的一些答案,但没有一个有效。我可以说我相当了解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等,仍然是唯一的,但由于用户删除一些内容并添加其他内容,因此不会像+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,而是一个用户可以互相帮助的平台。虽然这个答案确实指向了正确的方向,但它也可以包括一个与老年退休金问题相匹配的例子。谢谢你的评论。我确信我的答案包含了相应的例子。