2009-05-19 3 views
4

내가해야 할 일은 간단하다. 그러나 3am과 Im은 아마 명백한 것을 멀리 바라보고있다.테이블의 최신 레코드에 어떻게 가입합니까?

간단한 포럼을 코딩합니다. 한 테이블은 포럼 제목, 설명 등을 저장하고 다른 테이블은 게시물을 저장합니다. 포럼 목록에는 모든 포럼의 목록이 표시되며, 각 포럼에서 최신 게시물을 가져 와서 게시 주제, 포스터 및 게시물 ID 및 날짜를 ​​표시하고 싶습니다. 단순한.

유일한 문제는 게시물 테이블에 가입 할 때 테이블의 첫 번째 레코드에 참여하는 것이지 마지막 게시물은 해당 포럼의 마지막 게시물을 나타냅니다.

다음은 "최신"소식 (이제 "첫 번째 소식"으로 작동)에 대한 포럼 + 데이터를 가져 오는 간단한 쿼리입니다.

SELECT forum_title, forum_id, post_subject, post_user, post_id, post_date FROM board_forums 
    LEFT JOIN board_posts 
    ON (forum_id = post_parentforum AND post_parentpost = 0) 
WHERE forum_status = 1 
GROUP BY forum_id 
ORDER BY forum_position 

어떻게 해결할 수 있습니까?

답변

5

당신이 치고있는 문제는 고전입니다 모호한 GROUP BY 문제입니다. 이것은 다른 RDBMS (및 표준 SQL)가 사용자의 쿼리를 전혀 허용하지 않기 때문에 MySQL에만 해당됩니다. GROUP BY에 집계되지 않은 모든 열을 나열하지 않았으므로 쿼리가 단일 값 규칙을 통과하지 못합니다.

여기 그룹당 최대의 행을 얻기의 나의 마음에 드는 방법을 보여주는 솔루션입니다 :

SELECT f.forum_title, f.forum_id, p1.post_subject, p1.post_user, 
    p1.post_id, p1.post_date 
FROM board_forums f 
LEFT JOIN board_posts p1 
    ON (f.forum_id = p1.post_parentforum AND p1.post_parentpost = 0) 
LEFT JOIN board_posts p2 
    ON (f.forum_id = p2.post_parentforum AND p2.post_parentpost = 0 
     AND p1.post_id < p2.post_id) 
WHERE p2.post_id IS NULL AND f.forum_status = 1 
ORDER BY f.forum_position; 

p2.post_id IS NULL 경우, 그 어떤 게시물 p1에있는 후보다 큰 p2에서 발견되지 않는 것을 의미한다.

Ergo, p1은 최신 게시물입니다 (post_id은 자동으로 증가합니다).


다시 주석이와

약간의 문제. ID가 가장 큰 post_id가 최신 게시물 일 필요는 없습니다.

아무런 문제가 없습니다. 이전 게시물과 이후 게시물을 구별 할 수있는 열을 사용하십시오. 당신은 post_date를 언급합니다. 동점의 경우, 시간 순서대로 있어야하는 다른 열 (또는 열)과 관계를 끊어야합니다. 그래서 포기, 나는 다시이 질문에 대여섯 시간 듯했으나, 심지어이 작성되었을 때 쿼리가 일하는 방법을 알아낼 수 없었다 -

LEFT JOIN board_posts p2 
    ON (f.forum_id = p2.post_parentforum AND p2.post_parentpost = 0 
    AND (p1.post_date < p2.post_date 
     OR p1.post_date = p2.post_date AND p1.post_millisecond < p2.post_millisecond)) 
+1

는 당신이 문제를 언급 기뻐요. MySQL 사용자가 아니기 때문에 GROUP BY를 고치지 않고도 슬라이드 할 수 있다는 것을 깨닫지 못했습니다. 이제 알았어! :) – TML

+0

예프. MySQL은 여러분이하고있는 일을 알고 있고, 단일 값 규칙을 따르고 있다고 믿습니다. SQLite도 같은 동작을합니다. 모호한 열 (그룹당 둘 이상의 값)이있는 조회를 작성하면 RDBMS는 임의로 값을 선택합니다. MySQL은 "첫 번째"행의 값을 행의 물리적 저장 순서대로 선택합니다. 우연히도 SQLite는 "마지막"행의 값을 선택합니다. –

+0

약간의 문제가 있습니다. ID가 가장 큰 post_id가 최신 게시물 일 필요는 없습니다. 새 스레드가 만들어지면 최신 ID를 가지게되며이 경우 예제가 작동합니다. 그러나 더 낮은 ID를 가진 오래된 스레드에서 응답이 이루어지면 더 이상 작동하지 않으며 가장 높은 ID를 가진 therad를 표시합니다. post_date를 기반으로 표시해야합니다. –