MySQL에서 마지막 행을 선택하십시오.


181

SELECTMySQL 테이블의 마지막 행은 어떻게 합니까?

INSERT데이터를 보내고 있는데 이전 행에서 열 값을 검색해야합니다.

있다 auto_increment테이블이다.


8
"마지막 행"을 정의하십시오. 가장 높은 ID를 가진 사람? 아니면 가장 최근에 추가 된 것입니까?
EboMike

1
마지막 행을 나타내는 것-테이블에 auto_increment 또는 DATETIME 열이 있습니까?
OMG Ponies

예, auto_increment안에 있습니다. 가장 최근에 추가 한 것을 원합니다.
esqew

9
EboMike와 OMG Ponies가 말한 것처럼 마지막 행은 없습니다. 공이 가득한 가방을주고 마지막 공을 주면 어떻게하겠습니까?
Vincent Savard

답변:


402

예, 거기에 auto_increment가 있습니다

테이블 의 모든 행 중 마지막 을 원하면 마지막으로 MAX(id)정답입니다. 거의:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

12
수백만 개의 행을 정렬 해야하는 경우 이것이 느려지는 것을 두려워합니다.
Slawa

2
방금 20m 행 이상을 실행했으며 매우 빠릅니다. 이 쿼리를 처리하는 특별한 경우가 있다고 가정합니다. (편집 : MySQL 5.7, InnoDB 엔진)
Daniel Buckmaster

1
@Pekka : 주문을 사용하고 싶지 않습니다. 다른 옵션이 있습니까?
shiva

4
@Slawa id인덱싱 되지 않은 경우
Lorne의 후작

31

관계형 데이터베이스의 테이블은 행 집합 일뿐입니다. 그리고 수학의 세트는 순서가없는 모음입니다. 첫 번째 또는 마지막 행이 없습니다. 이전 행이나 다음 행이 없습니다.

정렬되지 않은 행 세트를 먼저 필드별로 정렬 한 다음 정의한 순서대로 결과 세트를 반복 할 수 있습니다.

자동 증분 필드가 있으므로 정렬 필드로 사용한다고 가정합니다. 이 경우 다음을 수행 할 수 있습니다.

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

우선 정렬되지 않은 행 집합을 your_auto_increment_field(또는 호출 한 항목별로) 내림차순으로 정렬하는 방법을 확인하십시오. 그런 다음을 사용하여 결과 집합을 첫 번째 행으로 제한합니다 LIMIT 1.


25

@spacepille이 제안한 두 개의 쿼리를 다음과 같은 단일 쿼리로 결합 할 수 있습니다.

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);

빠른 속도로 작동하지만 INNODB 테이블에서는 ORDER + LIMIT보다 밀리 초가 약간 느립니다.


@karthikeyan은 4 일 전에 답변을 썼으며 2015 년 12 월에 답변했습니다.
vzr

아니, 나 4 일 전에 철자를 수정하고 수정했습니다 ... 게시 날짜는 answered Jun 14 at 9:41약 1 년 6 개월 일찍 2014입니다 :)
Dwza

여기 공기를 맑게하는 것이 옳습니다. 'Jun 14'는 2016 년 6 월 14 일을 의미하며 @karthikeyan은이 시점에서 2 개월 동안 만 멤버로 활동했습니다.
Robert Brisita

Ssooo ... @karthikeyan의 답변은 이것의 사본입니다!
Cliff Burton

24

많은 행이있는 테이블에서 두 개의 쿼리가 더 빠를 것입니다 ...

SELECT @last_id := MAX(id) FROM table;

SELECT * FROM table WHERE id = @last_id;


4

가장 최근에 추가 된 것을 원하면 타임 스탬프를 추가하고 가장 높은 타임 스탬프 (1)를 기준으로 역순으로 순서를 선택하십시오. ID별로 이동하려면 ID별로 정렬하십시오. JUST가 추가 한 것을 사용하려면을 사용하십시오 mysql_insert_id.


4

거의 모든 데이터베이스 테이블에는 auto_increment 열이 있습니다 (일반적으로 id)

테이블의 모든 행 중 마지막 행을 원하면

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

또는

두 개의 쿼리를 다음과 같은 단일 쿼리로 결합 할 수 있습니다.

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);

자동 증분은 DBA (또는 테이블을 만든 사람)가 자동 증분을 구현 한 경우에만 해당
WhatsThePoint

2
SELECT * FROM adds where id=(select max(id) from adds);

이 쿼리는 테이블의 마지막 레코드를 가져 오는 데 사용되었습니다.


아래 답변의 사본
Jbur43

2

여기에 많은 답변이 자동 증분 열이 색인되어 있으면 자동 증분 순서대로 동일하게 표시됩니다.

당신은 그런 분야가 있고이 경우 보조 노트에, 이다 기본 키 사용에 대한 성능 저하가없는 order byselect max(id). 기본 키는 데이터는 (적어도 InnoDB에 대한) 데이터베이스 파일에 정렬되는 방식이며, RDBMS 어디 데이터의 끝을 알고,하고 최적화 할 수있는 order by id + limit 1범위는 AS 동일하게max(id)

이제 자동 증가 된 기본 키가없는 경우 이동량이 적은 도로입니다. 기본 키는 3 개의 필드로 구성된 자연 키일 수 있습니다. 그러나 모든 것이 손실되는 것은 아닙니다. 프로그래밍 언어에서 먼저 행 수를 얻을 수 있습니다.

SELECT Count(*) - 1 AS rowcount FROM <yourTable>;

그런 다음 LIMIT절 에서 얻은 숫자를 사용하십시오.

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

불행히도 MySQL은 LIMIT절 에서 하위 쿼리 또는 사용자 변수를 허용하지 않습니다.


1

명령 OFFSET에서 를 사용할 수 있습니다 LIMIT.

SELECT * FROM aTable LIMIT 1 OFFSET 99

테이블에 100 개의 행이있는 경우 primary_key에 의존하지 않고 마지막 행을 반환합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.