2014-11-26 1 views
0

에 정확하지 않습니다 여기 내 DB 데이터의 샘플입니다 :데이터의 순서는 MySQL의

모두 두 개의 열이 INT

tuanId ,tuanSort 
'375579', '55' 
'370576', '54' 
'366222', '54' 
... 
'346268', '52' 
'369608', '52' 
'370587', '52' 
'370775', '52' 
... 
'370225', '52' 
'370588', '52' 
'360758', '52' 
'366390', '51' 

과 내가 울부 짖는이 SQL을 시도 :

SELECT * FROM `tuan`.`TuanItem` WHERE ... ORDER BY `tuanSort` DESC LIMIT 140,20; 


SELECT * FROM `tuan`.`TuanItem` WHERE ... ORDER BY `tuanSort` DESC LIMIT 160,20; 

및 이 잘못된 데이터를 얻었으므로 페이지 매김을 만들고 싶지만 두 번째 페이지의 첫 번째 페이지에는 동일한 데이터가 있습니다.

예를 들어, 첫 번째 그림의 17 행이이 개 사진 그래서

enter image description here enter image description here

에 두 번 보여 주었다, 정렬 값은 이러한 문제를 일으킬 수있는 동일? 아니면 MySQL은 그런 선택에 문제가 있습니까?

+0

'tuanSort'는 char/varchar 열입니까? – Rahul

+2

문제의 원인을 설명해 주시겠습니까? 나는 그것을 볼 수 없다. – Jens

+0

테이블에 몇 개의 행이 있습니까? 왜 그런 오프셋을 사용하고 있습니까? – EternalHour

답변

2

점을 감안 의미 오프셋 tuanSort은 고유하지 않으며 동작이 사양에 있습니다.

하나의 쿼리가 특정 행을 157 번째 행으로 반환한다는 것을 알 수 있습니다. 다른 쿼리 실행에서는 161 번째 행으로 반환됩니다.

결정 성있는 시퀀스를 얻으려면 ORDER BY 절에 추가 열을 지정하십시오 (예 :


문이 순서 뒤에 의도는 "페이징"인 경우

ORDER BY tuanSort DESC, tuanId DESC 

등 이전 페이지의 "마지막"행에서 고유 한 염기 서열 식별자를 저장하는 등의보다 효율적인 접근 방법이있다. 모든 스무 행을 가져 오는 경우

tuanSort,tuanId 튜플이 고유 경우

...

WHERE tuanSort <= :last_tuanSort 
    AND (tuanSort < :last_tuanSort OR tuanId < :last_tuanId) 
    AND ... 
ORDER BY tuanSort DESC, tuanId DESC 
LIMIT 20 

, 마지막 행에서 tuanSorttuanId을 저장합니다. 다음 "페이지"에서 쿼리 조건 자에 저장된 값을 제공하십시오.

하지만 물어 보지 않은 질문에 대한 답변입니다.

+0

감사합니다. 그리고 주문 키가 고유하지 않을 때 mysql이 select를 수행하는 방법은 결과가 정렬 되었습니까? 정렬 된 경우 두 select에 반복 행이있는 이유는 무엇입니까? –

+1

@MikeTang : 행은 ORDER BY 절에 지정된 표현식에 의해서만 "순서대로"보장됩니다. ORDER BY 절의 열 조합이 고유하지 않으면 MySQL은 일치하는 값 집합 내의 행을 선택한 순서대로 반환 할 수 있습니다. 반환되는 행의 순서가 보장되지는 않습니다. – spencer7593

0

데이터베이스 테이블을 새로 고쳐야한다고 생각합니다.

다음을 시도해보십시오 : 이동 -> TuanItem-> 작업 -> 테이블 순서 변경 -> tuanid를 선택하고 오름차순으로 설정하십시오.

+0

mysql (phpmyadmin)에서이 작업을 수행하십시오. –

+0

예, 나는 tuanId를 오름차순으로 시도합니다. 그러나 그 이유는 무엇입니까? 순서가 같은 값을 가지면, MySQL은 결과를 정렬하지 않습니까? –

+0

이것은 관찰 된 결과 집합에 영향을 줄 수 있지만 특정 쿼리가 행을 반환하는 순서를 보장하지는 않습니다. 특정 순서로 결과 집합을 반환하려면 쿼리의'ORDER BY' 절에 적절한 표현식을 사용해야합니다. – spencer7593

0

당신의 문제는 2 쿼리에서 동일한 데이터를 얻는 것입니다.

는 변경 limit 160,20

SELECT * FROM `tuan`.`TuanItem` WHERE ... ORDER BY `tuanSort` DESC LIMIT 140,0; 

SELECT * FROM `tuan`.`TuanItem` WHERE ... ORDER BY `tuanSort` DESC LIMIT 160,141; 

에 0 데이터가 0에서 시작하고 같은 값을 얻을 수 있도록 (141)에서 두 번째 쿼리의 시작이 두 번

+0

나는 이것이 전혀 문제가 아니라고 생각합니다. MySQL **'LIMIT m, n' **은 "첫 번째 **'m' ** 행을 건너 뛰고 다음 **'n' ** 행을 반환합니다. – spencer7593

+0

아니 m은 결과의 한계이고 n은 결과의 첫 번째 반환. 당신이 그것을 시도 했는가? – CodeSlayer

+0

그래, 나는 그것을 시도했다. 나는 당신에게 똑같은 질문을 할 것이다 : 그것을 시도 했는가? 나는 당신이 논쟁의 순서에 대해 혼란스러워한다고 생각한다. 'LIMIT m, n'은'LIMIT n OFFSET m'과 동등합니다. [http://dev.mysql.com/doc/refman/5.5]는'OFFSET' 키워드 대신 쉼표를 사용할 때와 다릅니다. /en/select.html](http://dev.mysql.com/doc/refman/5.5/en/select.html) "두 인수를 사용하면 첫 번째 인수는 반환 할 첫 번째 행의 오프셋을 지정하고 두 번째는 반환 할 최대 행 수를 지정합니다. " – spencer7593