Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Wählen Sie N Zeilen aus, aber mit nur eindeutigen Werten in einer Spalte

Wahrscheinlich nicht die eleganteste Lösung und die Leistung von IN kann bei größeren Tabellen leiden.

Die verschachtelte Abfrage ruft das minimale Birthyear ab für jede Stadt. Nur Datensätze, die dieses Birthyear haben werden in der äußeren Abfrage abgeglichen. Wenn Sie nach Alter ordnen und dann auf 3 Ergebnisse beschränken, erhalten Sie die 3 ältesten Personen, die auch die ältesten in ihrer Stadt sind (Egon Spengler fällt aus..)

SELECT Name, City, Birthyear, COUNT(*) AS ct
FROM table
WHERE Birthyear IN (SELECT MIN(Birthyear)
               FROM table
               GROUP by City)
GROUP BY City
ORDER BY Birthyear DESC LIMIT 3;

+-----------------+-------------+------+----+
| name            | city        | year | ct |
+-----------------+-------------+------+----+
| Henry Jones     | Chicago     | 1899 | 1  |
| Mac Taylor      | New York    | 1955 | 1  |
| Sarah Connor    | Los Angeles | 1959 | 1  |
+-----------------+-------------+------+----+

Bearbeiten - GROUP BY City hinzugefügt zur äußeren Abfrage, da Personen mit gleichen Geburtsjahren mehrere Werte zurückgeben würden. Die Gruppierung nach der äußeren Abfrage stellt sicher, dass nur ein Ergebnis pro Stadt zurückgegeben wird, wenn mehr als eine Person dieses Mindest-Birthyear hat . Der ct Spalte zeigt an, ob es in der Stadt mehr als eine Person mit diesem Birthyear gibt