我在堆栈上找到了这个问题的一些答案,但没有一个有效。我可以说我对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芽中上下行。对不起大家。我仍然需要帮助。
答案 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);
根据您的需要改变它;)