Можно ли слить в SELECT в SQL? - PullRequest
6 голосов
/ 04 декабря 2011

Допустим, я хочу получить 100 записей из таблицы с именем messages, и я хочу получить их следующим образом:

1st message
100th message
2nd message
99th message
3rd message
98th message
(...)

Есть ли способ сделать это эффективно ? Какой будет соответствующий запрос? Или я должен сделать запрос, чтобы выбрать первые 50, запрос, чтобы выбрать последние 50, а затем объединить результаты?

Ответы [ 3 ]

2 голосов
/ 04 декабря 2011

Попробуйте, если ваш идентификатор представляет собой последовательность чисел:

Сначала

SET @half = (SELECT MAX(id) FROM messages)/2;

Затем

SELECT * FROM `messages` ORDER BY (IF(id<@half,@half*2-id,id-1)) DESC,id ASC;
0 голосов
/ 04 декабря 2011
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;
0 голосов
/ 04 декабря 2011

Смысл в том, чтобы создать два виртуальных столбца «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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...