假设我想从名为messages
的表中检索100条记录,我想通过以下方式获取它们:
1st message
100th message
2nd message
99th message
3rd message
98th message
(...)
有没有办法有效地?什么是适当的查询? 或者我应该查询选择前50个,查询选择最后50个然后合并结果?
答案 0 :(得分:2)
如果您的ID是一系列数字,请尝试:
第一
SET @half = (SELECT MAX(id) FROM messages)/2;
然后
SELECT * FROM `messages` ORDER BY (IF(id<@half,@half*2-id,id-1)) DESC,id ASC;
答案 1 :(得分:0)
重点是创建两个虚拟列“serie_order”(变体)和“serie”(常量),您将在数据的两个部分上使用(您必须将数据分成两部分)。
SELECT * FROM (
SELECT 1 as serie, message_id AS serie_order , * FROM
(SELECT message_id FROM messages ) as part_up
UNION
SELECT 2 as serie, 101-message_id as serie_order, * FROM
(SELECT message_id FROM messages) as part_down
) AS world
ORDER BY serie_order ASC, serie ASC
LIMIT 100
答案 2 :(得分:0)
set @rank:=0;
select id from
(select id, @rank:=(coalesce(@rank, 0)+1) as new_order
from a_table
order by some_column limit 100) as ordering
order by if (new_order<=50, new_order-1, abs(100-new_order)) asc;