1 Востаннє редагувалося Betterthanyou (30.04.2020 23:23:39)

Тема: MySQL Отримати "5 вищих" і "5 нижчих" записів

У списку впорядкованому по спаданню (від найбільшого числа до найменшого числа) потрібно вибрати "5 вищих" і "5 нижчих" рядка, в залежності від індексу

Наприклад для "2 вищих" і "2 нижчих"

В таблиці присутні такі рядки:

id Scores
 1 300
 5 200
 7 100
 3  90
87  88
 6  50
65  33
 4  22
33   2
17   0

Мені потрібно для ід 87, я очікую отримати

 7 100
 3  90
87  88
 6  50
65  33

Як по сортувати зрозуміло - команда "ORDER BY"

А як вибрати "5 вищих" і "5 нижчих" записів ?

2

Re: MySQL Отримати "5 вищих" і "5 нижчих" записів

OFFSET, LIMIT, UNION

Подякували: leofun011

3 Востаннє редагувалося Betterthanyou (01.05.2020 12:32:40)

Re: MySQL Отримати "5 вищих" і "5 нижчих" записів

koala написав:

OFFSET, LIMIT, UNION

Можна більш детальніше ?

Наприклад якщо б знати що потрібна під таблиця починається з 2 позиції можна було б написати


SELECT * FROM Table ORDER BY Number LIMIT 2, 5;

Результат був би таким (для того прикладу що я писав у темі)

 7 100
 3  90
87  88
 6  50
65  33

Але як це дізнатися ?

4 Востаннє редагувалося fed_lviv (01.05.2020 12:52:34)

Re: MySQL Отримати "5 вищих" і "5 нижчих" записів

Betterthanyou написав:

У списку впорядкованому по спаданню

Betterthanyou написав:

В таблиці присутні такі рядки:

Betterthanyou написав:

Як по сортувати зрозуміло - команда "ORDER BY"

Якось все заплутано, так це існуюча таблиця, яка є відсортована чи щось інше?

Бо якщо у Вас є така таблиця, то все що Вам потрібно дізнатися з якого запису робити вибірку, а потім:

SELECT
*
FROM
sort_tab
LIMIT {N}, 11;

Якщо ж немає таблиці з впорядкованими даними + scores не унікальні, то можна щось таке:

SELECT
    * 
FROM
    (SELECT * FROM tab WHERE scores >= ( SELECT scores FROM tab WHERE id = {id} ) AND id <> {id} ORDER BY scores LIMIT 5 ) AS tab1 
UNION
SELECT
    * 
FROM
    ( SELECT * FROM tab WHERE scores < ( SELECT scores FROM tab WHERE id = {id} ) ORDER BY scores DESC LIMIT 5 ) AS tab2 
UNION
SELECT * FROM tab WHERE id = {id} ORDER BY scores DESC, FIELD( id, {id} );

Хоч, краще конкретні дані підставити замість ось цих запитів:

SELECT scores FROM tab WHERE id = {id} 
SELECT scores FROM tab WHERE id = {id}
SELECT * FROM tab WHERE id = {id} 
Betterthanyou написав:

Але як це дізнатися ?

Ну тут знову повертаємося до того, що ж це таке і де воно існує - список, таблиця,...?
Якщо ж це відсортована таблиця, то можна так (MySQL 8 -> window functions ):

SELECT num FROM ( SELECT id, row_number ( ) over ( ) AS num FROM sort_tab ) AS tab1 WHERE id = {id}

Далі вираховуєте, щось типу цього -> (num-1-5), а також не забувайте враховувати, що може вийти від'ємне число...

Подякували: Betterthanyou, leofun01, flatliner3