У меня есть две таблицы players
и scores
.Присоединиться к одной строке из таблицы в MySQL
Я хочу, чтобы сгенерировать отчет, который выглядит примерно так:
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. Какое лучшее обходное решение здесь?
+1: Есть ли у вас шанс сравнить ваш и мой подход? Мне любопытно, если кто-то более эффективен, но я склоняюсь к вашему из-за того, как MySQL обрабатывает LEFT JOIN/IS NULL ... –
, если в моих оценках 'join s ...' больше условий соединения, чем 's.player_id = p .id', скопировал бы все эти условия для «левых оценок внешнего соединения s2 ...»? –
@OMG Ponies: Я обнаружил, что использование GROUP BY в MySQL является убийцей производительности, поскольку MySQL почти всегда создает временную таблицу. Принимая во внимание, что с использованием внешнего решения соединения (или эквивалентного NOT EXISTS с коррелированным подзапросом) можно использовать индексы покрытия, и поэтому объединение может быть выполнено в памяти. –