Вопрос

У меня есть две столы 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..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top