2011-05-11 4 views
4

나는 포럼을 만들고 있는데, 주어진 포럼에 대한 모든 주제를 표시하는 페이지를 만드는 데 어려움을 겪고 있습니다. & 필드로 구성되어 세 개의 관련 테이블은 다음과 같습니다어느 정도 복잡한 MySQL 문

Table: forums_topics Table: forums_posts Table: users 
-------------------- ------------------- ------------ 
int id     int id     int id 
int forum_id   int topic_id   varchar name 
int creator    int poster 
tinyint sticky   varchar subject 
         timestamp posted_on 

나는 다음과 같은 SQL을 시작했습니다

이 내가 원하는 걸 얻고있는 것으로 보인다
SELECT t.id, 
      t.sticky, 
      u.name AS creator, 
      p.subject, 
      COUNT(p.id) AS posts, 
      MAX(p.posted_on) AS last_post 
    FROM forums_topics AS t 
    JOIN users AS u 
LEFT JOIN forums_posts AS p ON p.topic_id = t.id 
    WHERE t.forum_id = 1 
     AND u.id = t.creator 
GROUP BY t.id 
ORDER BY t.sticky 

(항목의 ID 번호, 경우의 주제를 만든 사람, 끈적 끈적한 주제, 주제의 제목, 각 주제의 게시물 수 및 최신 게시물의 시간 소인). 실수가 있으면 알려주세요.

내가 지금 문제가되는 것은 가장 최근의 포스터의 이름을 얻는 방법입니다. 누군가 내 SQL을 편집하여 어떻게 그렇게되는지 설명 할 수 있습니까? 필요하다면 더 많은 정보를 제공 할 수 있습니다. 테이블을 재구성하면 간단해질 수 있습니다.

SELECT t.id, 
     t.sticky, 
     u.name AS creator, 
     p.subject, 
     COUNT(p.id) AS posts, 
     MAX(p.posted_on) AS last_post, 
     (SELECT name FROM users 
     JOIN forums_posts ON forums_posts.poster = users.id 
     WHERE forums_posts.id = MAX(p.id)) AS LastPoster 
FROM forums_topics AS t 
JOIN users AS u 
LEFT JOIN forums_posts AS p ON p.topic_id = t.id 
WHERE t.forum_id = 1 
    AND u.id = t.creator 
GROUP BY t.id 
ORDER BY t.sticky 

는 기본적으로, 당신은 최대 ID를 기반으로 사용자를 찾을 하위 쿼리를 수행

답변

1

다음은이 작업을 수행 할 수있는 간단한 방법입니다. ID가 GUID이거나 다른 이유로 주문되지 않은 경우 대신 posted_on 타임 스탬프를 기반으로 조회를 수행 할 수 있습니다.

+0

트릭을하는 것처럼 보입니다. 대단히 감사합니다! 여기를 두드리는 동안 나는 같은 테이블을 두 번 결합하는 것에 흥미로운 것을 발견했습니다. 이것은 작동하므로 계속 사용하겠습니다.하지만 다시 돌아와 어쩌면 내가 subselect없이 끝낼 수 있는지 알아보기 위해 메모를 작성하겠습니다. – Geomancer