Извлечение строк по минимальному количеству баллов из базы данных MySQL - PullRequest
2 голосов
/ 13 июня 2019

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

Вместе с каждым человеком и счетом, Дата (хранится как Unix Time, но здесь показывается нормально) и некоторые другие данные (например, Курси погода) записывается.

Мои проблемы заключаются в следующем: 1) Я хочу получить только самый старый «лучший» результат от каждого игрока.То есть, если лучшим игроком был результат «Пар» (независимо от курса), и он был выполнен 3 раза, я хочу только самый первый.Мой код не справляется с этим, и я не знаю, как это сделать.Он выводит все экземпляры лучшего результата игрока.

2) Я также хочу иметь возможность получать данные из определенных подмножеств данных.Пример: ИЗ гольф-данных ГДЕ курс = $ название_курса или по погодным условиям и т. Д. Мои решения заставляют меня сделать это дважды.Есть ли способ не повторяться?

Это настолько близко, насколько я мог бы получить:

SELECT a.*
FROM golfdata a
INNER JOIN (
SELECT Name, MIN(Score) Score
FROM golfdata b
GROUP BY Name) c 
    ON a.Name = c.Name AND a.Score = c.Score

Если я хочу фильтровать по курсу, я использую:

(SELECT * FROM golfdata WHERE Course = $course_name) in place of "golfdata"

Примерные данные, намного больше в реальности.

+--------+------------+-------+-------------+------+
| Name   | YYYY-MM-DD | Score | Location    | Wind |
+--------+------------+-------+-------------+------+
| Tom    | 2019-5-25  | 70    | Augusta     | Fast |
| Amanda | 2019-1-13  | 73    | Augusta     | Calm |
| David  | 2018-12-25 | 69    | Pine Valley | Slow |
| David  | 2018-9-15  | 72    | Oakmont     | Calm |
| David  | 2018-5-19  | 71    | Pine Valley | Slow |
| Tom    | 2018-8-11  | 70    | Oakmont     | Calm |
+--------+------------+-------+-------------+------+

Ожидаемый результат:

+--------+------------+-------+-------------+------+
| Name   | YYYY-MM-DD | Score | Location    | Wind |
+--------+------------+-------+-------------+------+
| Amanda | 2019-1-13  | 73    | Augusta     | Calm |
| David  | 2018-12-25 | 69    | Pine Valley | Slow |
| Tom    | 2018-8-11  | 70    | Oakmont     | Calm |
+--------+------------+-------+-------------+------+

Примечание. Самый старый «лучший» балл Тома был выбран независимо от курса.

Дополнительная информация: Я нахожусь на MySQL v5.7, если это вообще помогает.

1 Ответ

0 голосов
/ 13 июня 2019

Возможно что-то вроде этого:

SELECT a.name,MIN(a.date) DATE,c.Score,a.Location,a.Wind 
  FROM golfdata a
  INNER JOIN 
  (SELECT NAME,MIN(score) score FROM golfdata b GROUP BY NAME) c
ON a.Name=c.Name AND a.Score=c.Score
GROUP BY a.NAME,c.score;

Я добавил MIN(a.date) DATE в выборку, чтобы получить наименьшую дату, когда результат будет одинаковым. Затем я добавил GROUP BY a.NAME, c.score во внешний запрос.

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