가능한 중복 :
What is the SQL for 'next' and 'previous' in a table?쿼리 이전/다음 기록
나는 테이블에서 다음 또는 이전 기록을 얻을 수있는 더 좋은 방법을 찾기 위해 노력하고있어.
: 이CREATE TABLE news (
news_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
news_datestamp DATETIME NOT NULL,
news_author VARCHAR(100) NOT NULL,
news_title VARCHAR(100) NOT NULL,
news_text MEDIUMTEXT NOT NULL
);
지금 프론트 엔드에 내가 news_id
으로 분류하고있어, 난 같은 비교적 간단 뭔가를 할 수 있으며, 다음 또는 이전 레코드 탐색 버튼을 원하는 :의 나는 블로그 또는 뉴스 테이블이 있다고 가정 해 봅시다
그러나 뉴스는 모든 필드별로 정렬 할 수 있으며 어떤 필드가 정렬되어 있는지 반드시 알 필요는 없습니다. 예를 들어 사용자가 news_author
과 같은 정렬을하면이 기능이 작동하지 않습니다.
나는 필자가 필요로하는 레코드를 찾을 때까지 전체 테이블을 정렬하고 모든 레코드를 루핑하는 오히려 못 생기고 비효율적 인 방법을 사용했습니다.
$res = mysql_query("SELECT news_id FROM news ORDER BY `$sort_column` $sort_way");
$found = $prev = $next = 0;
while(list($id) = mysql_fetch_row($res)) {
if($found) {
$next = $id;
break;
}
if($id == $old_news_id) {
$found = true;
continue;
}
$prev = $id;
}
더 나은 방법이 있어야합니다.
편집, 설명 :
제한을 사용하지 않는 이유는 무엇입니까? 나는 현재 레코드의 결과 세트에서의 위치를 알아야 할 것입니다. 이게 당신의 전형적인 페이지 매김이라면, 나는 과 같은 질의 문자열을 가질 수 있습니다. 그래야 $startpage
을 증가시키고 LIMIT $startpage,1
을 쿼리에 추가 할 수 있습니다. 하지만 ?news_id=n
으로 다시 작성되는 news/news_id-news-title-here
과 같은 URL이 있으므로 시작 페이지가 무엇인지 알 수 없습니다. 내가 그랬더라도, 사용자가 외부 링크를 통해 거기에 도착한다면 어떨까요? 사용자가 현재 페이지를 읽는 동안 새 게시물이 추가되면 어떻게 될까요?
너무 위의 예제의 세부 사항에 집착하지 마세요, 진짜 질문은 이것이다 : 고유 레코드 ID 및 임의의 정렬 열을 감안할 때
, 기록이 바로 가을을 결정하는 방법이 그 특정 레코드 전후에, 전체 레코드 세트를 루핑하지 않고.
그냥 궁금합니다. 주사에서 $ sort_column을 보호 할 수있는 것이 있습니까? –
@Shrapnel, yes ... 위의 예는 가상의 예제이지만 실제 코드에서는 유효하고 정렬 가능한 열 배열'$ sort_column = (in_array ($ sort_column, $ valid_columns))에 대해'$ sort_column'을 검증하겠습니까? $ sort_column : $ default_sort_column; ' – Rob
내 대답에 편집 참조하십시오 – Rufinus