Показать первые N строк по категориям в MySQL 8 без дубликатов в другой категории - PullRequest
0 голосов
/ 15 февраля 2019

Аналогично этот вопрос , у меня есть следующая таблица в MySQL 8.0.15:

CREATE TABLE golf_scores (id INT PRIMARY KEY AUTO_INCREMENT, person TEXT, score INT, age INT);
INSERT INTO golf_scores (person, score, age) VALUES ('Angela', 40, 25),('Angela', 45, 25),('Angela', 55, 25),('Peter',45, 32),('Peter',55,32),('Rachel', 65, 35),('Rachel',75,35),('Jeff',75, 16);
SELECT * FROM golf_scores;
+----+--------+-------+------+
| id | person | score | age  |
+----+--------+-------+------+
|  1 | Angela |    40 |   25 |
|  2 | Angela |    45 |   25 |
|  3 | Angela |    55 |   25 |
|  4 | Peter  |    45 |   32 |
|  5 | Peter  |    55 |   32 |
|  6 | Rachel |    65 |   35 |
|  7 | Rachel |    75 |   35 |
|  8 | Jeff   |    75 |   16 |
+----+--------+-------+------+

Мы хотим выбрать следующие «лучшие» 3 строки:

+----+--------+-------+------+
| id | person | score | age  |
+----+--------+-------+------+
|  1 | Angela |    40 |   25 |
|  4 | Peter  |    45 |   32 |
|  6 | Rachel |    65 |   35 |
+----+--------+-------+------+

Другими словами, самые низкие 3 оценки в гольфе без дубликатов по лицам , а также другие столбцы из этого ряда .Я не беспокоюсь о связях;Мне бы все равно хотелось получить три результата.

Запрос SELECT person, MIN(score) as min_score FROM golf_scores GROUP BY person ORDER BY min_score LIMIT 3; дает правильные строки, но ограничен столбцами person и score`.Когда я пытаюсь изменить его следующим образом:

SELECT id, person, MIN(score) as min_score, age FROM golf_scores GROUP BY person ORDER BY min_score LIMIT 3;

я получаю эту ошибку:

ОШИБКА 1055 (42000): выражение # 1 списка SELECT отсутствует в предложении GROUP BYи содержит неагрегированный столбец records.golf_scores.id, который функционально не зависит от столбцов в предложении GROUP BY;это несовместимо с sql_mode = only_full_group_by

Я также пытался удалить дубликаты имен с помощью SELECT id, DISTINCT person, score, age FROM golf_scores ORDER BY score LIMIT 3, но получаю ошибку

ОШИБКА 1064 (42000): у вас есть ошибкав вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с «РАЗЛИЧНЫМ человеком», наберите ОТ ОТ ГОРЯЧИХ СПОСОБОВ ЗАКАЗАТЬ ПО ЛИЦУ 3 »в строке 1

Как можноЯ получаю желаемый вывод в MySQL?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вот один из способов:

SELECT x.* 
  FROM golf_scores x
  JOIN 
     ( SELECT MIN(id) id FROM
            ( SELECT a.* 
                FROM golf_scores a 
                JOIN 
                   ( SELECT person, MIN(score) score FROM golf_scores GROUP BY person ) b 
                  ON b.person = a.person 
                 AND b.score = a.score 
            ) n
        GROUP
           BY person
            , score 
     ) y
    ON y.id = x.id
 ORDER 
    BY x.score LIMIT 3;
0 голосов
/ 15 февраля 2019

Использование row_number():

select t.*
from (select t.*, row_number() over (partition by person order by score) as seqnum
      from golf_scores  t
     ) t
where seqnum = 1
order by score asc
limit 3;

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

select gs.*
from golf_scores gs
where gs.id = (select gs2.id
               from golf_scores gs2
               where gs2.person = gs.person
               order by gs2.score asc
               limit 1
              )
order by score asc
limit 3;

Это также может быть самым быстрымпуть с индексом на golf_scores(person, score, id).

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