Mysql
 sql >> база данни >  >> RDS >> Mysql

Присъединете се към един ред от таблица в MySQL

Това е най-големият проблем с n-на-група, който се появява често в Stack Overflow.

Ето обичайния ми отговор:

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 е най-ранният.

Относно коментара си за вратовръзки:Трябва да имате политика, за която да използвате в случай на равенство. Една от възможностите е, ако използвате автоматично увеличаващи се първични ключове, този с най-малка стойност е по-ранният. Вижте допълнителния термин във външното присъединяване по-долу:

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

;

По принцип трябва да добавите термини за тайбрек, докато стигнете до колона, която гарантирано е уникална, поне за дадения играч. Първичният ключ на таблицата често е най-доброто решение, но съм виждал случаи, когато друга колона е била подходяща.

По отношение на коментарите, които споделих с @OMG Ponies, не забравяйте, че този тип заявка има огромна полза от правилния индекс.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да направите регулярен израз в MySQL заявка

  2. Има ли MySQL еквивалент на TIMESTAMP на Oracle С ЧАСОВА ЗОНА?

  3. SQL Получаване на X последни записи от 'персонализиран' post_type с броене на потребители индивидуален брой персонализиран post_type

  4. Как работи функцията LCASE() в MySQL

  5. грешка в mysql модула за изгледи на drupal