programing

최신 타임스탬프별 MySQL 선택

yoursource 2023. 9. 4. 22:47
반응형

최신 타임스탬프별 MySQL 선택

SO에 대한 몇 가지 비슷한 유형의 질문을 보았지만, 특정 문제에 대한 해결책을 찾을 수 없었습니다. (참고로, 이것들은 제 실제 칼럼이 아니라 간략한 예일 뿐입니다.)

기본 테이블이 있습니다.my_table:

user_1 user_2 타임스탬프 참고(표의 일부가 아님)
23 25 2012-08-10 22:00:00
24 22 2012-08-10 19:00:00 <=== 이 행을 반환하고 싶습니다.
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 

그러나 이것은 제가 찾고 있는 행을 반환하지 않습니다.이 쿼리를 수정하는 데 도움이 된다면 매우 좋을 것입니다.

정말 고마워요.

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

편집:

그런데 원래 쿼리가 작동하지 않는 이유가 궁금할 경우 다음과 같이 설명합니다.

  • 에서 물건을 고르다my_table...
  • 어디에user_2= 22
  • 그리고.timestamp(어느 정도의 가치, 일단 접어둡시다)
  • 한도 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
  • 및 타임스탬프 = 2012-08-10 22:00:00
  • 한도 1

그리고 당신은 그런 다툼이 없다는 것을 알 수 있습니다.

SQL Server에서 유사한 문제가 발생한 경우 이 방법이 사용자에게 유용합니다(이전 게시물에서 제안한 MySQL 쿼리는 SQL Server에서 작동하지 않음).

SELECT * FROM my_table 
WHERE    timestamp =  ( SELECT MAX( timestamp ) FROM my_table 
                        WHERE user_2 = 22 )

또 다른 방법은GROUP BYuser_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;

이 질문은 제가 이 훌륭한 답변에서 찾은 답변에서 수정한 것입니다.

이게 내가 가진 전부야.

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']
}

이 문제에 대한 해결책은 다음과 같습니다.

 SELECT *
 FROM my_table AS t1
 WHERE user_2 = 22
 AND timestamp = (
 SELECT MAX( timestamp )
 FROM my_table AS t2
 WHERE t1.user_2 = t2.user_2 );

간단히 제거WHERE user_2 = 22각 고유 사용자에 대한 최신 타임스탬프를 확인하려는 경우.

언급URL : https://stackoverflow.com/questions/11912221/mysql-select-by-newest-timestamp

반응형