diesen Datensatz Gegeben:MySQL: Wählen Sie N Zeilen, aber nur mit eindeutigen Werten in einer Spalte
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 brauche die drei ältesten Personen zu finden, aber nur eine von jeder Stadt.
Wenn es wäre nur die drei ältesten, wäre es ...
- Henry Jones/Chicago
- Mac Taylor/New York
- Egon Spengler/New York
Da sowohl Egon Spengler als auch Mac Taylor in New York ansässig sind, würde Egon Spengler ausfallen und der nächste (Sarah Connor/Los Angeles) würde stattdessen kommen.
Irgendwelche eleganten Lösungen?
Update:
Zeit eine Variation von PConroy ist 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 extrem langsam mit großen Datenmengen (abgebrochen nach 5 Minuten) , aber die Unterabfrage zu einem JOIN zu verschieben, wird es viel schneller machen. Es dauerte etwa 0,15 Sekunden für ca. 1 Mio. Zeilen in meiner Testumgebung. Ich habe einen Index für "City, Birthyear" und einen zweiten für "Birthyear".
Hinweis: Dies bezieht sich auf ...
Hinweis: Dies ist nicht das eigentliche Problem, das ich lösen muss, aber ein Beispiel. Ich brauche die Lösung für zwei verschiedene Jobs: a) Finde den teuersten Gegenstand in jedem Zimmer - wenn mehrere zum selben Preis: Hol dir den neuesten. b) 10 Jobs aus einer Warteschlange holen (geordnet nach Priorität), aber nur eine pro Kunde. – BlaM