Присоединяйтесь к одной строке из таблицы в MySQL
-
30-09-2019 - |
Вопрос
У меня есть две столы players
а также scores
.
Я хочу создать отчет, который выглядит что-то подобное:
player first score points
foo 2010-05-20 19
bar 2010-04-15 29
baz 2010-02-04 13
Прямо сейчас мой запрос выглядит что-то вроде этого:
select p.name player,
min(s.date) first_score,
s.points points
from players p
join scores s on s.player_id = p.id
group by p.name, s.points
мне нужно s.points
это связано с ряд, который min(s.date)
Возвращает. Это происходит с этим запросом? То есть как я могу быть уверенным, я получаю правильный s.points
Значение для присоедининной строки?
Сторона примечания: я представляю, что это как-то связано с отсутствием густой рейтинга MySQL. Какой лучший обходной путь здесь?
Решение
Это проблема величайшей N-групповой группы, которая часто поднимается на переполнении стека.
Вот мой обычный ответ:
select
p.name player,
s.date first_score,
s.points points
from players p
join scores s
on s.player_id = p.id
left outer join scores s2
on s2.player_id = p.id
and s2.date < s.date
where
s2.player_id is null
;
Другими словами, учитывая оценка S, попробуйте найти счет S2 для того же игрока, но с более ранней датой. Если более ранний балл не найден, то S является самым ранним.
Ваш комментарий о связях: вы должны иметь политику, на которую можно использовать в случае галстука. Одна возможность заключается в том, что если вы используете первичные клавиши Auto-risrementing, тем наименьшее значение является ранее. Смотрите дополнительный срок во внешнем присоединении ниже:
select
p.name player,
s.date first_score,
s.points points
from players p
join scores s
on s.player_id = p.id
left outer join scores s2
on s2.player_id = p.id
and (s2.date < s.date or s2.date = s.date and s2.id < s.id)
where
s2.player_id is null
;
По сути, вам нужно добавить термины Tiefrefer, пока не допустите в столбец, который гарантирован уникальным, по крайней мере, для данного проигрывателя. Первичный ключ таблицы часто является лучшим решением, но я видел случаи, когда был подходит другой столбец.
Что касается комментариев, которые я поделился с @OMG Ponies, помните, что этот тип запроса чрезвычайно пользуется из правильного индекса.
Другие советы
Большинство RDMBS даже не позволят вам включать несовпущенные столбцы в пункте выбора при использовании группы. В MySQL вы получите значения со значений из случайных строк для ваших негагируемых колонн. Это полезно, если у вас на самом деле одинаковое значение в определенном столбце для всех строк. Поэтому приятно, что MySQL не ограничивает нас, хотя это важно понять.
Целая глава посвящена этому в SQL AntiPatterns..