MySQL получает строки, начинающиеся с определенного идентификатора после сортировки / упорядочения по - PullRequest
1 голос
/ 20 октября 2019

Я получил эту таблицу:

id | score
1  | 1
2  | 4
3  | 4
4  | 3
5  | 2
6  | 2
7  | 1
8  | 4
9  | 2
10 | 3

Мне нужно упорядочить ее по счету desc:

id | score
2  | 4
3  | 4
8  | 4
4  | 3
10 | 3
5  | 2
6  | 2
9  | 2
1  | 1
7  | 1

и получить первые 3 строки, которые начинаются с id 6

Итак, результат должен быть:

6  | 2
9  | 2
1  | 1

Возможно ли это? Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 20 октября 2019

Я бы подошел к этому с совокупным значением sum() (доступно в MySQL 8.0):

select 
    id, 
    score
from mytable
order by 
    sum(id = 6) over(order by score desc, id) desc, 
    score desc,
    id
limit 3

Запись заказов sum() в требуемом направлении;как только запись, имеющая id = 6, будет достигнута, сумма принимает значение 1. Это позволяет поставить эти записи на вершине. Остальное - просто добавление дополнительных критериев сортировки и ограничение количества результатов.

Демонстрация на DB Fiddle :

| id  | score |
| --- | ----- |
| 6   | 2     |
| 9   | 2     |
| 1   | 1     |

В более ранних версиях mysql вы можете эмулировать сумму окна с помощью пользовательской переменной следующим образом:

select 
    id, 
    score
from 
  (select @sm := 0) s
  cross join (select id, score from mytable order by score desc, id) t
order by 
    case when id = 6 then @sm := @sm + 1 end desc, 
    score desc,
    id
limit 3

Демонстрация на DB Fiddle : те же результаты

1 голос
/ 20 октября 2019

При этом:

select t.*
from tablename t cross join (select * from tablename where id = 6) c
where t.score < c.score or (t.score = c.score and t.id >= c.id)
order by t.score desc, t.id
limit 3

См. Демоверсию . Результаты:

| id  | score |
| --- | ----- |
| 6   | 2     |
| 9   | 2     |
| 1   | 1     |
1 голос
/ 20 октября 2019

С этой таблицей

CREATE TABLE table3
    (`id` int, `score` int)
;

INSERT INTO table3
    (`id`, `score`)
VALUES
    (1, 1),
    (2, 4),
    (3, 4),
    (4, 3),
    (5, 2),
    (6, 2),
    (7, 1),
    (8, 4),
    (9, 2),
    (10, 3)
;

И этим выбором

SELECT `id`, `score`
FROM (SELECT `id`,`score`,if (id = 8,@scoreid:= @scoreid +1,@scoreid) scoreid
       From table3, (SELECT @scoreid :=0) s  Order by score desc) t1 
Where scoreid > 0 LIMIT 3;

вы получите

id  score
8   4
4   3
10  3

Пример DBFiddle https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=95e2051d560c2ac27fdcc8f9d04acf5d

...