MySQL: Выберите строки N, но только с уникальными значениями в одном столбце

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

34
задан Community 23 May 2017 в 10:27
поделиться

5 ответов

Вероятно, не самое изящное из решений и производительность IN могут пострадать на больших таблицах.

вложенный запрос получает минимум Birthyear для каждого города. Только записи, у кого есть это Birthyear, подобраны во внешнем запросе. Упорядочивание возрастом, тогда ограничивающим 3 результатами, получает Вас 3 самых старых человека, которые являются также самыми старыми в их городе (Egon Spengler выбывает..)

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

Редактирование - добавило GROUP BY City к внешнему запросу, поскольку люди с теми же годами рождения возвратят несколько значений. Группировка на внешнем запросе гарантирует, что только один результат будет возвращен на город, если больше чем у одного человека будет тот минимум Birthyear. ct столбец покажет, существует ли больше чем один человек в городе с этим Birthyear

18
ответ дан ConroyP 27 November 2019 в 17:15
поделиться

Это - вероятно, не самое изящное и самое быстрое решение, но оно должно работать. Я ожидаю то, чтобы видеть решения настоящих гуру базы данных.

select p.* from people p,
(select city, max(age) as mage from people group by city) t
where p.city = t.city and p.age = t.mage
order by p.age desc
3
ответ дан Tamas Czinege 27 November 2019 в 17:15
поделиться

Что-то как этот?

SELECT
  Id, Name, City, Birthyear
FROM
  TheTable
WHERE
  Id IN (SELECT TOP 1 Id FROM TheTable i WHERE i.City = TheTable.City ORDER BY Birthyear)
2
ответ дан Tomalak 27 November 2019 в 17:15
поделиться

Не симпатичный, но должен работать также с несколькими людьми с тем же д.р.:

Данные тестирования:

select id, name, city, dob 
into people
from
(select 1 id,'Egon Spengler' name, 'New York' city , 1957 dob
union all select 2, 'Mac Taylor','New York', 1955
union all select 3, 'Sarah Connor','Los Angeles', 1959
union all select 4, 'Jean-Luc Picard','La Barre', 2305
union all select 5, 'Ellen Ripley','Nostromo', 2092
union all select 6, 'James T. Kirk','Riverside', 2233
union all select 7, 'Henry Jones','Chicago', 1899
union all select 8, 'Blah','New York', 1955) a

Запрос:

select 
    * 
from 
    people p
    left join people p1
    ON 
        p.city = p1.city
        and (p.dob > p1.dob and p.id <> p1.id)
        or (p.dob = p1.dob and p.id > p1.id)
where
    p1.id is null
order by 
    p.dob
1
ответ дан kristof 27 November 2019 в 17:15
поделиться

@BlaM

UPDATED Только что обнаружил, что хорошо использовать USING вместо ON. Это удалит дублирующиеся столбцы в результатах.

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

ORIGINAL POST

привет, я пытался использовать ваш обновленный запрос, но получал неправильные результаты, пока не добавил дополнительное условие в join (также дополнительный столбец в join select). перенёс на ваш запрос, я использую следующее:

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

теоретически вам не нужна последняя GROUP BY P.City, но я оставил её на всякий случай. возможно, удалю её позже.

1
ответ дан 27 November 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: