MySQL альтернатива T-SQL с галстуками - PullRequest
4 голосов
/ 12 августа 2010

У меня есть таблица, из которой я хочу получить N лучших записей.Записи упорядочены по значениям, а некоторые записи имеют одинаковые значения.То, что я хотел бы сделать здесь, это получить список лучших N записей, включая связанные.Вот что в таблице:

+-------+--------+
| Name  | Value  |
+-------+--------+
| A     | 10     |
| B     | 30     |
| C     | 40     |
| D     | 40     |
| E     | 20     |
| F     | 50     |
+-------+--------+

Теперь, если я хочу получить топ-3, вот так

SELECT * FROM table ORDER BY Value DESC LIMIT 3

Я получаю это:

+-------+--------+
| Name  | Value  |
+-------+--------+
| F     | 50     |
| C     | 40     |
| D     | 40     |
+-------+--------+

ЧтоЯ хотел бы получить это

+-------+--------+
| Name  | Value  |
+-------+--------+
| F     | 50     |
| C     | 40     |
| D     | 40     |
| B     | 30     |
+-------+--------+

Я вычисляю ранг каждой записи, так что мне действительно хотелось бы получить первые N ранжированных записей вместо первых N записей, упорядоченных по значению.Вот как я вычисляю ранг:

SELECT Value AS Val, (SELECT COUNT(DISTINCT(Value))+1 FROM table WHERE Value > Val) as Rank

В T-SQL что-то подобное можно сделать, выполнив следующее:

SELECT TOP 3 FROM table ORDER BY Value WITH TIES

У кого-нибудь есть идеи, как это сделать в MySQL?Я понимаю, что это можно сделать с помощью подзапросов или временных таблиц, но у меня недостаточно знаний для этого.Я бы предпочел решение без использования временных таблиц.

Ответы [ 3 ]

6 голосов
/ 12 августа 2010

Это у вас работает?

select Name, Value from table where Value in (
    select distinct Value from table order by Value desc limit 3
) order by Value desc

Или, возможно:

select a.Name, a.Value 
from table a
join (select distinct Value from table order by Value desc limit 3) b
     on a.Value = b.Value
3 голосов
/ 13 июня 2013
select a.Name, a.Value 
from table a
join (select Value from table order by Value desc limit 3) b
     on a.Value = b.Value

Это похоже на ответ @ Fosco, но без DISTINCT в подзапросе.Его версия возвращает игроков с наибольшим количеством N баллов, а не лучших N игроков (плюс связи).Например, если счет 50, 50, 50, 40, 40, 30, 20, он вернет 6 игроков (3x50, 2x40, 1x30), но вы, вероятно, просто хотите 3x50.

0 голосов
/ 18 сентября 2018

Начиная с MySQL 8, вы можете использовать оконные функции для эмуляции семантики WITH TIES путем фильтрации RANK(). Например:

SELECT Name, Value
FROM (
  SELECT Name, Value, RANK() OVER (ORDER BY Value DESC) AS rk
  FROM table
) t
WHERE rk <= 3

Обратите внимание, что при более внимательном прочтении вашего вопроса это не совсем то, что вам нужно, а именно то, что T-SQL может сделать с помощью предложения TOP n WITH TIES.

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