Выбор MySQL - если значение столбца избыточно, показывать только самые новые по метке времени

У меня есть такая таблица:

timesent            |nr | value 
2018-10-31 05:23:06 | 4 | Value 3
2018-10-31 05:20:19 | 4 | Value 2
2018-10-31 05:19:35 | 4 | Value 1
2018-10-31 04:55:56 | 3 | Value 2
2018-10-31 03:05:15 | 3 | Value 1
2018-10-31 01:31:49 | 2 | Value 1
2018-10-30 04:11:16 | 1 | Value 1 

На данный момент мой выбор выглядит так:

SELECT * FROM values WHERE ORDER BY timesent DESC

Я хочу сделать оператор sql-select, который возвращает мне только самое последнее значение каждого «nr».

Мои навыки недостаточно хороши, чтобы перевести это в sql-оператор. Я даже не знаю, зачем мне гуглить.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Values - это Зарезервированное ключевое слово в MySQL. Подумайте о том, чтобы изменить название вашей таблицы на другое; в противном случае вам придется использовать обратные кавычки вокруг него

Есть разные способы добиться результата для вашей проблемы. Один из способов - выполнить «Самостоятельное левое соединение» на nr (поле, в котором вы хотите получить только строку максимального значения timesent).

SELECT v1.* 
FROM `values` AS v1 
LEFT JOIN `values` AS v2 
  ON v1.nr = v2.nr AND 
     v1.timesent < v2.timesent 
WHERE v2.nr IS NULL 

Для Версия MySQL> = 8.0.2 вы можете использовать Оконные функции. Мы определим Row_Number() для каждой строки в разделе nr, с timesent в порядке убывания (наивысшее значение timesent будет иметь номер строки = 1). Затем используйте этот набор результатов в Производная таблица и учитывайте только те строки, где номер строки равен 1.

SELECT dt.timesent,  
       dt.nr, 
       dt.value 
FROM 
(
  SELECT v.timesent, v.nr, v.value, 
         ROW_NUMBER() OVER (PARTITION BY v.nr 
                            ORDER BY v.timesent DESC) AS row_num  
  FROM `values` AS v 
) AS dt 
WHERE dt.row_num = 1

Тем не менее, другой подход состоит в том, чтобы получить максимальное значение timesent для группы nr в производной таблице. Теперь присоедините этот набор результатов к основной таблице, чтобы отображались только строки, соответствующие максимальному значению:

SELECT v.timesent,  
       v.nr, 
       v.value 
FROM 
`values` AS v 
JOIN 
(
  SELECT nr, MAX(timesent) AS max_timesent
  FROM `values` 
  GROUP BY nr 
) AS dt ON dt.nr = v.nr AND 
           dt.max_timesent = v.timesent 

Спасибо за ваш ответ. Я не понимаю этого прямо сейчас, но попытаюсь разобраться. :)

Andreasschnetzer 31.10.2018 10:48

Спасибо большое за вашу помощь. Боже мой - ничего не понимаю. Что означают «v1.», «V» и «dt.» Перед именами столбцов?

Andreasschnetzer 31.10.2018 11:04

@Andreasschnetzer Это псевдонимы. Они делают запрос читаемым и однозначным, когда он включает несколько таблиц / подзапросов и т. д. Пройдите это руководство: mysqltutorial.org/mysql-alias

Madhur Bhaiya 31.10.2018 11:10

Спасибо. Я сделаю это. Я посмотрел ваш профиль, и вы входите в 1% респондентов mysql. - Это видно :) - Ты чертовски хорош

Andreasschnetzer 31.10.2018 11:16

@Andreasschnetzer спасибо за добрые слова. Если требуется какое-либо объяснение по этим шагам; дайте мне знать; Обновлю ответ. Если этот ответ вам помог, подумайте о том, чтобы пометить его как принятый, а также проголосуйте за него. Спасибо :)

Madhur Bhaiya 31.10.2018 11:17

Другие вопросы по теме