Выберите последние строки с тем же именем

#mysql #sql

#mysql #sql

Вопрос:

Я хочу перечислить названия фруктов из моей таблицы, но я не хочу перечислять более одного названия фруктов от одного и того же пользователя

моя таблица выглядит так

 id     |    username         |  fruits
------------------------------------------
1      |    John             |  strawberry
2      |    Nick             |  banana
3      |    Ben              |  apple
4      |    Nick             |  pear
5      |    John             |  cherry
  

вывод должен быть таким;

 5  |  John     |    cherry
4  |  Nick     |    pear
3  |  Ben      |    apple
  

Я попробовал этот код, но в нем перечислены первые плоды

 "SELECT * FROM mytable GROUP BY username DESC"
  

Ответ №1:

Вот «хороший» способ сделать это ROW_NUMBER , предполагая, что вы используете MySQL 8 :

 SELECT username, fruits
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY username ORDER BY id DESC) rn
    FROM yourTable
) t
WHERE rn = 1;
  

В более ранних версиях MySQL мы можем присоединиться к подзапросу, который находит самую последнюю запись для каждого username :

 SELECT t1.username, t1.fruits
FROM yourTable t1
INNER JOIN
(
    SELECT username, MAX(id) AS max_id
    FROM yourTable
    GROUP BY username
) t2
    ON t1.username = t2.username AND
       t1.id = t2.max_id;
  

Ответ №2:

вы могли бы использовать in

 SELECT a.username, a.fruits
FROM table_name a
where (a.username,a.id) in
(
    SELECT username, MAX(id) as mid 
    FROM table_name
    GROUP BY username
) 
  

Ответ №3:

Вы можете использовать коррелированный подзапрос

 select id,username, fruits
from tablename a
where id in (select max(id) from tablename b where a.username=b.username)
  

Ответ №4:

это также будет работать отдельно от других ответов:

 select `username`,`fruits` from (select `id12`,`username`,`fruits`,RANK() over 
(PARTITION  by `username`
order by `id12` desc )as rn   from Table1)m where rn=1;
  

проверка: https://www.db-fiddle.com/f/vmWYczLQLanhvcqChuRL4b/0

Ответ №5:

Вы можете использовать коррелированный подзапрос :

 select t.*
from table t
where t.id = (select max(t1.id) from table t1 where t1.username = t.username);