MySQL: Wählen Sie N Zeilen aus, aber nur eindeutige Werte in einer Spalte

Ausgehend von diesem Datensatz:

ID  Name            City            Birthyear
1   Egon Spengler   New York        1957
2   Mac Taylor      New York        1955
3   Sarah Connor    Los Angeles     1959
4   Jean-Luc Picard La Barre        2305
5   Ellen Ripley    Nostromo        2092
6   James T. Kirk   Riverside       2233
7   Henry Jones     Chicago         1899

Ich muss die 3 ältesten Personen finden, aber nur eine von jeder Stadt.

Wenn es nur die drei ältesten wären, wäre es ...

Henry Jones / ChicagoMac Taylor / New YorkEgon Spengler / New York

Da sich jedoch sowohl Egon Spengler als auch Mac Taylor in New York befinden, würde Egon Spengler aussteigen und stattdessen die nächste (Sarah Connor / Los Angeles) hinzukommen.

Irgendwelche eleganten Lösungen?

Aktualisieren:

Derzeit ist eine Variante von PConroy die beste / schnellste Lösung:

SELECT P.*, COUNT(*) AS ct
   FROM people P
   JOIN (SELECT MIN(Birthyear) AS Birthyear
              FROM people 
              GROUP by City) P2 ON P2.Birthyear = P.Birthyear
   GROUP BY P.City
   ORDER BY P.Birthyear ASC 
   LIMIT 10;

Seine ursprüngliche Abfrage mit "IN" ist bei großen Datenmengen extrem langsam (nach 5 Minuten abgebrochen), aber das Verschieben der Unterabfrage in einen JOIN beschleunigt sie erheblich. Es dauerte ca. 0,15 Sekunden. 1 Mio. Zeilen in meiner Testumgebung. Ich habe einen Index über "Stadt, Geburtsjahr" und einen zweiten über "Geburtsjahr".

Hinweis: Dies bezieht sich auf ...

Auswählen eindeutiger Zeilen in einer Reihe von zwei MöglichkeitenSQL-Abfrage, um den neuesten Preis zu erhalten

Antworten auf die Frage(5)

Ihre Antwort auf die Frage