MySQL Select By Newest Timestamp
Я видел некоторые подобные типы вопросов на SO, однако мне не удалось найти решение моей конкретной проблемы. (FYI, это не мои настоящие столбцы, просто сокращенный пример).
У меня есть базовая таблица:
`my_table`
user_1 user_2 timestamp
======================================================
23 25 2012-08-10 22:00:00
24 22 2012-08-10 19:00:00 <=== I would like to return this row
24 22 2012-08-10 17:00:00
21 17 2012-08-10 15:00:00
Итак, я хочу, чтобы:
1) Select the "newest" row, based on timestamp AND
2) Select the 'user_2' column when given a value.
Я пробовал что-то вроде:
SELECT *
FROM my_table
WHERE user_2 = 22
AND timestamp = (
SELECT MAX( timestamp )
FROM my_table )
LIMIT 1
Но это не возвращает строку, которую я ищу. Любая помощь по исправлению этого запроса будет отличной.
Большое спасибо.
Ответы
Ответ 1
SELECT * FROM my_table -- standard stuff
WHERE user_2 = 22 -- predicate
ORDER BY timestamp DESC -- this means highest number (most recent) first
LIMIT 1; -- just want the first row
Edit:
Кстати, если вам интересно, почему ваш исходный запрос не сработал, разрешите разбивать фрагменты:
- выберите некоторые вещи из
my_table
...
- где
user_2
= 22
- и
timestamp
= (некоторое значение, отложите это на время)
- limit 1
Теперь, возвращаясь к этому значению timestamp
, оно исходит из вашего подзапроса:
SELECT MAX( timestamp ) FROM my_table
Обратите внимание, что этот подзапрос не ограничивает строки на основе user_2
- он запрашивает максимальную временную метку во всей таблице. Эта максимальная временная метка является первой в вашей таблице выше: (user_1 = 23, user_2 = 25, timestamp = 2012-08-10 22:00:00).
Итак, позвольте подключиться к запросу верхнего уровня:
- выберите некоторые вещи из
my_table
...
- где user_2 = 22
- и timestamp = 2012-08-10 22:00:00
- limit 1
... и вы можете видеть, что такой строки нет.
Ответ 2
Если у кого-то есть аналогичная проблема в SQL Server, это будет работать для вас (предлагаемый запрос MySQL в предыдущем сообщении не работает в SQL Server):
SELECT * FROM my_table
WHERE timestamp = ( SELECT MAX( timestamp ) FROM my_table
WHERE user_2 = 22 )
Ответ 3
Другой метод - GROUP BY
столбец user_2
при вычислении MAX(timestamp)
. Это сделает MAX(timestamp)
вычисление не последней даты во всей таблице, а скорее последней отметки времени для каждой группы записей с тем же значением user_2
.
Итак, например, ваш запрос может быть:
SELECT * FROM my_table
WHERE user_2 = 22
AND timestamp =
(SELECT MAX(timestamp) FROM my_table
WHERE user_2 = 22
GROUP BY user_2)
LIMIT 1;
Этот запрос адаптирован из ответа, найденного в этом отличном ответе.
Ответ 4
Это все, что я получил.
SELECT timestamp
FROM my_table
WHERE user_22 = '22'
ORDER BY timestamp DESC /*or ASC*/
И когда вы запрашиваете его, код должен быть
while($row = mysql_fetch_array(the sql query)){
$timestamp = $row['timestamp']
}