2011-01-07 4 views
4

테이블의 마지막 (최신) 행을 가져와야합니다 (즉, MySQL의 자연 순서를 사용합니다 - 즉, ORDER BY 절을 사용하지 않고 얻는 것). 그러나 할 수있는 키가 없습니다. 주문하기!모든 종류의 키가없는 마지막 행 선택

테이블의 유일한 '키'는 인덱싱 된 MD5 필드이므로 실제로 주문할 수는 없습니다. 타임 스탬프, 자동 증가 값 또는 다른 필드도 없기 때문에 쉽게 주문할 수 있습니다. 이것이 내가 'newest'의 지표로서 자연 정렬 순서 만 남겨 놓은 이유입니다.

그리고 불행히도 적절한 auto_increment를 추가하기 위해 테이블 ​​구조를 변경하는 것은 문제가되지 않습니다. :(

누구나이는 일반 SQL/w를 할 수있는 방법에 대한 아이디어를 가지고, 또는 내가 SOL입니까?

+0

무시 무시 비효율적 인 방법의 종류에 대한 필요를 사용할 수 있습니다. 그 이외에는 키/데이트 필드 없이는 작동하지 않을 것이라고 생각할 수 없습니다. –

+0

나는 일반적으로 레코드를 명시 적으로 지정하지 않고 반환되는 레코드의 순서에 대해 아무런 가정도하지 않는다고 생각합니까? 자연 질서 같은 것이 있습니까? – ChristopheD

+3

아무런 행도 삭제하지 않으면 MyISAM 테이블에 "자연적인"순서가있는 것처럼 보입니다. 결코 보장 할 수는 없지만 그것에 의존하지는 않을 것입니다. 테이블을 재 설계하는 것이 훨씬 덜 번거로울 것입니다. – nos

답변

1

을 기본적으로, 당신은 할 수 없습니다. 나는를 추가하는 게 좋을 것 일반적으로

그 BY 자동 incrememt 및 ORDER와 대리 기본 키 :

SELECT * 
FROM yourtable 
ORDER BY id DESC 
LIMIT 1 

그러나 귀하의 질문에 당신이 쓰는

...

변경 t 그는 적절한 auto_increment를 추가하는 테이블 구조가 문제가되지 않습니다.

그래서 변수를 사용하여 시뮬레이션 ROW_NUMBER를 사용하고 생각할 수있는 또 다른 적은 적절한 옵션 :

SELECT * FROM 
(
    SELECT T1.*, @rownum := @rownum + 1 AS rn 
    FROM yourtable T1, (SELECT @rownum := 0) T2 
) T3 
ORDER BY rn DESC 
LIMIT 1 

이 성능에 심각한 의미를 가지고 있습니다 : 그것은 전체 검사를 필요로하며, 결과가 보장되지 않습니다 하위 쿼리의 특정 순서로 반환 될 것입니다. - 은 정렬 순서로 가져 오지만, 다시는 그렇지 않을 수도 있습니다. - 순서를 지정하지 않으면 서버가 원하는 순서를 자유롭게 선택할 수 있습니다. 이제 은 가능한 한 적은 작업을하기 위해 디스크에 저장된 순서를 선택합니다. 그러나 이것에 의존하는 것은 현명하지 않습니다. 그것의 MyISAM이 있다면

+1

또한 행이 삽입 순서로 반환된다고 가정합니다. 반드시 그렇지는 않습니다. – Mchl

+0

@Mchl : +1 좋은 지적, 그 경고를 추가했습니다. –

2

당신은 행은이 테이블에 추가 및 삭제되지 않습니다 가정하지만

  1. 때문 신뢰할 수없는 두 개의 질의

    SELECT COUNT(*) FROM yourTable; 
    SELECT * FROM yourTable LIMIT useTheCountHere - 1,1; 
    

    에 그것을 할 수 있습니다.

  2. 그 동안에는이 테이블에 다른 쓰기 작업이 수행되지 않는다고 가정합니다 (테이블을 잠글 수 있음)
  3. MyISAM 테이블은 ALTER TABLE을 사용하여 순서를 변경할 수 있으므로 삽입 순서가 더 이상 유지되지 않습니다.

이 엔진은 테이블을 마음대로 재주문 할 수 있기 때문에 InnoDB에서 전혀 신뢰할 수 없습니다.

2

이유를 묻는 질문이 있습니까?

오라클의 경우 MySQL에서도 마찬가지 일 수 있지만 옵티마이 저는 결과를 반환하는 데 가장 빠른 기록/주문을 선택합니다. 따라서 동일한 쿼리를 두 번 실행하고 다른 대답을 얻으려면 데이터가 정적 인 경우 잠재 성이 있습니다.

+0

난 그걸 몰랐어, 모든 행을 얻고 마지막 하나를 잡으면 무의미한 ... – Alex

+0

글쎄, 내 의견은 오라클과 관련 있다고 말했다. 테이블에 타임 스탬프 열을 추가 할 수있는 방법이 있습니까? – diagonalbatman

0

order by 조항이 없으면 결과를 얻을 순서를 보증 할 수 없습니다. SQL 엔진은 임의의 순서를 자유롭게 선택할 수 있습니다.

그러나 어떤 이유로 당신은 여전히이 순서에 의존 할 경우, 그 다음은 실제로 결과에서 마지막 레코드를 반환합니다

(MySQL은 전용) :

하위 쿼리에서
select * 
from (select *, 
       @rn := @rn + 1 rn 
     from mytable, 
       (select @rn := 0) init   
     ) numbered 
where rn = @rn 

레코드가 검색됩니다 order by없이, 일련 번호가 부여됩니다. 그런 다음 외부 쿼리는 마지막으로 계산 된 숫자가있는 쿼리 만 선택합니다.

0

우리는 모든 레코드를 가져오고 마지막 남기고 모두 폐기하는 것 problem-

SELECT MAX(id) as last_id,column1,column2 FROM table HAVING id=last_id;