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 YorkDa 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