2012-03-14 2 views
3

이전 레코드를 기반으로 한 번에 하나의 레코드를 얻을 수있는 포럼 순위 시스템을 시도하고 있습니다.순위 및 이전에 선택한 행을 기준으로 행 선택

예제 테이블이다 : 나는 간단한 쿼리 ORDER BY POST_REPLIES DESC을 할 경우

 
| POST_ID | POST_REPLIES | 
-------------------------- 
| 1  |  5  | 
| 2  |  2  | 
| 3  |  8  | 
| 4  |  8  | 
| 5  |  12 | 
-------------------------- 

, 나는 POST_ID 5, 4, 3, 1, 2를 얻을.

하지만 내가하고 싶은 것은 다음 행 (한 번에 하나의 행) 만 얻고 현재 게시물에 기반합니다.

예를 들면 : 나는 현재 포스트 # 3를보고하고있는 경우, 버튼은 #을 게시 가리 것이다 나는 현재 문제가 중복 다루는 데 4

등 '대부분의 응답과 다음 게시물'가 표시된다 나는 3에서 4 사이의 루프를 실행한다. (3 점에서 4 점, 4 점에서 3 점으로)

나는 그 자체를 테이블에 조인하고 어느 것이 더 크거나 작 았는지 비교하기 위해 놀았다. , 그러나 나는 1의 한계를 사용하고 있기 때문에, 행은 항상 1이므로 쓸모가 없다. 기본 쿼리는 다음과 같습니다.

SELECT * FROM posts 
    WHERE post_id != '$currentPost' 
    ORDER BY POST_REPLIES DESC, POST_ID DESC LIMIT 1 

어떻게하면됩니까? 예

limit 0,1 
제로 시작 기록이다

하나의 범위를 사용

+0

그룹 대신 하나의 회신을 받으려고합니까? –

+0

맞습니다. 현재 보시는 바로 다음에 '인기있는'게시물을 얻으려고합니다. – Bill

+0

알고 싶은 모든 사람들을 위해, 나는 4 시간마다 cron에 의해 업데이트 된 별도의 순위표를 작성하고, 생성 된 순위 #를 사용하여 다음 그림으로 이전으로 이동합니다. 이전에 내가했던 단 하나의 쿼리는 SQL에 대한 나의 짧은 경험으로 인해 너무 많은 서브 쿼리를 사용했습니다. 내가 가지고있는 쿼리는 mattedgod와 newtovers가 혼합 된 솔루션 이었지만, 실행하는데 약 2 ~ 3 초가 걸렸다. – Bill

답변

0

제한 페치 레코드 수이다.

limit 5,1 

은 여섯 번째 레코드를 얻습니다. 게시, 가져 오기 또는 세션을 통해 페이지 번호를 추적하고이를 사용하여 이러한 방식으로 쿼리를 조작 할 수 있습니다.

모든 레코드를 가져 와서 저장 한 다음 페이지별로 표시하는 것도 일반적이지만 많은 수의 레코드를 생성 할 경우 문제가 될 수 있습니다.

+0

그럴 수는 있지만, 양식 제출에 의해 요청 된 시스템에서 URL을 '깨끗하게'하고 마스크를 해제해야하므로이 프로젝트에서 GET 매개 변수를 사용할 수 없습니다. – Bill

1

첫 번째 단계는 결과를 "순위 지정"하는 것입니다. 내가 MySQL의에서이 일을 발견하는 가장 좋은 방법은 지금과 같은 변수입니다 :

SELECT posts.post_id, posts.post_replies, @rank := @rank + 1 AS rank 
FROM posts, (SELECT @rank := 0) r 

그런 다음 당신은 아마 당신이 필요 달성하기 위해 또 다른 하나의 쿼리 둥지에있을 것입니다. 그것이 올바른 방향으로 당신을 가리킨다면 알려주세요

+0

내가 피하고 싶었던 유일한 이유는 각 포럼보기에 대해 전체 테이블의 순위를 매기는 것이었지만, 현재 선택된 페이지의 바로 위에있는 (응답 수 기준으로) 제한된 수의 게시물에 대한 순위를 실험하고 있습니다. 즉, 내가 10 개의 답글을 가진 게시물을보고 있다면, 나는 3 개의 답 또는 그 이상을 갖는 모든 게시물을보고, 현재 선택된 게시물을 피하는 사람들의 순위를 매길 것이다. 난 당신이 게시 계속됩니다! – Bill

1
SELECT p.* 
FROM (
    SELECT POST_ID, POST_REPLIES 
    FROM posts 
    WHERE POST_ID = @currentId) as cur 
JOIN posts p 
    ON p.POST_REPLIES >= cur.POST_REPLIES 
    AND p.POST_ID > cur.POST_ID 
ORDER BY p.POST_REPLIES DESC, p.POST_ID 
LIMIT 1 ; 
+0

이것은 전에 시도한 것과 비슷합니다. 이것에 대한 유일한 문제는 ID에 의해 정렬되기도하지만, ID가 2 인 게시물이 ID가 30 인 게시물보다 더 많이 사용될 수 있습니다 (더 많은 응답). 이 경우 ID가 3 인 게시물을보고 10 개의 답글이 있는데 '다음'을 클릭하면 현재 ID보다 높은 ID의 게시물로 이동합니다. 나는이 mattedgod의 솔루션을 섞어서 내가 무엇이 올 수 있는지 알아보기 위해 게시 할 것이다! – Bill