返回上面的2行和所需ID下面的2行

时间:2013-12-28 14:26:04

标签: 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等,由于用户删除了一些内容并添加了其他内容,因此仍然是唯一的但不是像+1这样的增量东西。

现在我想选择ID和ID(例如3)并获取它上面的两行并显示它。如果ID为0,则选择4行低于0(所以总是5行)。

更新哦,我,我是如此愚蠢。我不需要按ID上下选择两行,我需要由销售人员选择它们。但是仍然需要根据销售情况从特定ID芽中上下行。对不起大家。我仍然需要帮助。

3 个答案:

答案 0 :(得分:1)

如果你想通过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;

答案 1 :(得分:1)

假设你要抽出5个ID,它们接近id 12.您可以通过减法计算到所需id的距离,并使用absolute value进行排序。

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

E.g。使用按距离排序ID将5行拉到所需的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)

答案 2 :(得分:0)

请阅读文档:
SELECT
UNION

以下是一个例子:

(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);

根据您的需要改变它;)