Учитывая этот набор данных:MySQL: Выберите N строк, но только уникальных значений в одном столбце
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
мне нужно найти 3 самых старых людей, но только один из каждого города.
Если бы только быть три старых, было бы ...
- Генри Джонс/Чикаго
- Mac Taylor/Нью-Йорк
- Эгон Шпенглер/Нью-Йорк
Однако, так как Эгон Шпенглер и Мак Тейлор находятся в Нью-Йорке, Эгон Шпенглер выпадет, а следующая (Сара Коннор/Лос-Анджелес) появится вместо него.
Любые элегантные решения?
Update:
В настоящее время изменение PConroy является лучшим/быстрым решением:
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;
Его первоначальный запрос с "IN" экстремально медленно с большими наборами данных (прерывается через 5 минут) , но перемещение подзапроса в JOIN ускорит его. Это заняло около 0,15 секунды прибл. 1 mio строк в моей тестовой среде. У меня есть указатель на «Город, Рождение», а второй - на «Рождение».
Примечание: Это связано с ...
Примечание: Это не настоящая проблема, которую я должен решить, но пример. Мне нужно решение для двух разных заданий: а) найти самую высокую цену в каждой комнате - если несколько с одинаковой ценой: получите самую новую. б) получить 10 заданий из очереди (упорядочено по приоритету), но только для каждого клиента. – BlaM 2008-10-10 11:07:12