MySQL — Как выбрать значение, связанное с самой последней датой максимальное / минимальное из всех значений

#mysql

#mysql

Вопрос:

Структура моей таблицы выглядит примерно так: 1. Автоматически сгенерированный первичный ключ (целое число) 2. имя (неуникальное) 3. значение 4. дата

Я хочу выполнить запрос, который возвращает значение, связанное с самой последней датой, а также максимальное / минимальное значение для всех дат, учитывая конкретное имя.

Например, если у меня есть таблица, подобная

 --------------------------------
| 1 |  jack  | 2  | 2019-03-25 |
| 2 |  james | 3  | 2019-03-25 |
| 3 |  jack  | 3  | 2019-03-26 |
| 4 |  jack  | 3  | 2019-03-27 |
| 5 |  james | 10 | 2019-03-27 |
| 6 |  jack  | 5  | 2019-03-28 |
--------------------------------
  

затем, когда я запрашиваю его, используя имя ‘jack’, я хочу, чтобы результат выглядел как

 ------------------------------
| name | current | max | min |
------------------------------
| jack |    5    |  5  |  2  |
------------------------------
  

Заранее спасибо за любую помощь..

Комментарии:

1. Нам нравится видеть, что вы что-то пробовали

2. Вы ищете агрегирующие (ГРУППИРУЮЩИЕ ПО) функции

3. Я знаю, что могу выполнить MAX (значение) и MIN (значение) с помощью GROUP BY name, но я не могу понять, как добавить самое последнее значение к результату.

4. Итак, покажите нам те биты, которые вы знаете.

Ответ №1:

Предполагая, что вы ничего не пробовали и не знаете, с чего начать, вот подход

 SELECT 
    name, -- first column is the name
    value as current, -- get the value as "current"
    (
        -- here we have nested query
        SELECT
            value
        FROM
            Test AS minT -- create an alias for the table to be able to refer it in the WHERE clause
        WHERE
            minT.name = name -- filters values only for the "name" that matches the name in the main query
        ORDER BY
            value ASC -- orders them by "value ASC" since we want the smallest value
        LIMIT 1 -- get only the first result
    ) as min,
    (
        SELECT
            value
        FROM
            Test as maxT
        WHERE
            maxT.name = name
        ORDER BY
            value DESC -- same as above just in reverse order
        LIMIT 1
    ) as max
FROM
    Test
ORDER BY -- orders the results by
    DATEDIFF(NOW(), date) ASC -- the diff (subtracts in days) the current date and the one in the table
LIMIT
    1 -- and just return the first row