#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