Подтвердить что ты не робот

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 

Но это не возвращает строку, которую я ищу. Любая помощь по исправлению этого запроса будет отличной.

Большое спасибо.

4b9b3361

Ответ 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']
}