2009-04-07 4 views
1

내가 만드는 중이라서 포럼에 대해 "범프 시스템"을 만들 수 있습니다 내림차순으로) 스레드 ID가 각 스레드의 threadID와 동일한 가장 최근의 게시물 (가장 큰 시간 소인). 그래서 기본적으로 스레드를 통과하고 MySQL이 스레드 0을 말하도록 데이터베이스를 점검하게합니다. 그러면 thread0이 0 인 게시물을 모두 검사하고 thread0의 게시물 중 가장 큰 시간 소인을 기준으로 thread0을 정렬합니다. 그런 다음 thread1, thread2 등을 위해 이것을 반복하고 그에 따라 정렬합니다.MySQL의 쿼리 내가 문제가 다음과 같은 작업을 수행 MySQL의 쿼리를 형성하는 데

이것도 가능합니까? 포럼의 "범프 시스템 (bump-system)"효과를 창출하는 것입니다. 여기서 가장 최근에 활성화 된 스레드가 스레드가 죽을 때까지 계속 목록의 맨 위로 밀어 부칠 때까지 아래로 떨어집니다. 이전에 스레드 테이블에 lastActivity 타임 스탬프를 저장하고 새 게시물을 스레드에 제출했을 때 업데이트 한 다른 구현을 사용했지만이 쿼리를 사용하면 훨씬 효율적으로 작업 할 수 있습니다.

고맙습니다. 여기에는 스레드와 게시물이라는 두 개의 테이블이 있습니다. 게시물에는 스레드가 속한 스레드의 ID를 저장하는 threadID 필드가 있으며 타임 스탬프 필드도 있습니다. 스레드는 게시물의 threadID에 해당하는 필드 threadID를가집니다.

답변

2

다음은 과거 MySql에서 저에게 효과적이었습니다. 쿼리에 각 스레드에 대한 자세한 내용을 포함 시키려면 SELECTGROUP BY에 열을 추가해야합니다.

select thread.threadID, max(comments.modifiedOn) as threadUpdated 
    from thread inner join comments on thread.threadID = comments.threadID 
    group by 1 
    order by 2 desc; 

이 쿼리는 스레드의 목록 내 가장 최근의 코멘트를 주문입니다 기본 요청을 제공합니다. 주석이없는 스레드는 반환하지 않으므로이를 수행하려면 외부 조인으로 조인을 변경해야합니다.

2
SELECT * 
FROM threads t 
LEFT JOIN 
     posts p 
ON  p.id = 
     (
     SELECT p.id 
     FROM posts pi 
     WHERE pi.threadID = t.threadID 
     ORDER BY 
       pi.timestamp DESC 
     LIMIT 1 
     ) 

posts (threadID, timestamp)에 대한 색인은이 검색어를 크게 향상시킵니다.

GROUP BY 솔루션과 달리이 쿼리는 posts에서 모든 필드를 선택하고 최신 posts.timestamp에 중복 항목이있는 경우에도 작동합니다.

+0

시도해 보셨습니까? IIRC, MySQL은 하위 쿼리 내에서 LIMIT 사용을 지원하지 않습니다. –

+0

물론 그랬습니다. MySQL은 IN 하위 쿼리에서 LIMIT를 지원하지 않으므로, 동등 조건과 함께 사용되는 일반 하위 쿼리에서는 괜찮습니다. – Quassnoi

0
SELECT t.*, p1.`timestamp` 
FROM threads t 
    JOIN posts p1 ON (p1.threadid = t.id) 
    LEFT JOIN posts p2 ON (p2.threadid = t.id 
    AND p1.`timestamp` < p2.`timestamp`) 
WHERE p2.threadid IS NULL 
ORDER BY p1.`timestamp` DESC; 
+0

최소한의 타임 스탬프 복제본을 필터링하지 않습니다. – Quassnoi

+0

좋은 지적. 타임 스탬프가 중복되는 경우 기본 조건 또는 다른 조건을 비교할 조건을 조인 조건에 추가해야합니다. –