Sql Выберите верхние 2, нижние 2 и 6 случайных записей - PullRequest
3 голосов
/ 04 июня 2011

Как выбрать первые 2, нижние 2 и 6 случайные (не в верхних 2 и нижних 2) записи таблицы, используя один запрос выбора SQL?

Ответы [ 3 ]

3 голосов
/ 04 июня 2011

В MS SQL 2005/2008:

with cte
as
(
    select 
        row_number() over (order by name) RowNumber, 
        row_number() over (order by newid()) RandomOrder,
        count(*) over() Total,
        *
    from sys.tables
)
select *
from cte
where RowNumber <= 2 or Total - RowNumber + 1 <= 2
union all
select *
from
(
    select top 6 *
    from cte 
    where RowNumber > 2 and Total - RowNumber > 2
    order by RandomOrder
) tt

Замените sys.tables именем вашей таблицы и измените order by name, чтобы указать условия заказа для верхних 2 и нижних 2.

1 голос
/ 04 июня 2011

Предполагается, что "order" находится в столбце id:

select * from (select id, id from my_table order by id limit 2) t1
union
select * from (select id, id from my_table where id not in (
    select * from (select id from my_table order by id asc limit 2) t22
    union
    select * from (select id from my_table order by id desc limit 2 ) t23)
order by rand()
limit 6) t2
union
select * from (select id, id from my_table order by id desc limit 2) t3

EDIT: исправлен синтаксис и проверен запрос - он работает

1 голос
/ 04 июня 2011

Возможно, нет ни одного выбранного выбора, но его можно выполнить за один вызов:

/* Top 2 - change order by to get the 'proper' top 2 */
SELECT * from table ORDER BY id DESC LIMIT 2
UNION ALL
/* Random 6.. You may want to add a WHERE and random data to get the random 6 */
/* Old Statement before edit - SELECT * from table LIMIT 6 */

SELECT * from table t
  LEFT JOIN (SELECT * from table ORDER BY id DESC LIMIT 2) AS top ON top.id = t.id
  LEFT JOIN (SELECT * from table ORDER BY id DESC LIMIT 2) AS bottom ON bottom.id = t.id
WHERE ISNULL(top.id ) AND ISNULL(bottom.id)
ORDER BY RANDOM()
LIMIT 6

UNION ALL
/* Bottom 2 - change order by to get the 'proper' bottom 2 */
SELECT * from table ORDER BY id ASC LIMIT 2

Что-то в этом родеВ основном, UNION All это трюк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...