2010-06-24 2 views
4

그래서 내 데이터베이스 설정은 매우 간단합니다.맞춤 포럼 만들기, 카테고리의 게시물 수를 계산하는 쿼리 작성에 대한 도움

나는 forum_cat 테이블 (포럼 카테고리)과 forum_post 테이블을 가지고 있습니다.

forum_post에는 각 포럼 게시를 카테고리에 연결하는 fk_forum_cat_id 필드가 있습니다.

forum_post에는 기본적으로 원본 게시물에 속한 것으로 표시된 fk_parent_forum_post_id 필드가 있습니다.

더 자세히 알려면 forum_post에 date_addeddate_edited 필드가 있습니다.

이제 포럼의 첫 페이지를 생성하려고합니다. 나는 포럼 카테고리 목록을 보여주고 싶다. 각 카테고리에는 게시 횟수와 최신 게시물이 있어야합니다. 누군가가 저에게 한 가지를하는 쿼리로 어떤 방향을 제시 할 수 있습니까? 20 개의 별도 쿼리를 실행하고 싶지 않습니다!

+0

어떻게하면 최신 게시물을 결정할 수 있습니까? 날짜 열이 있습니까? fk_parent_forum_post_id가 자동 증가 정수 필드입니까? –

+0

forum_post에 date_posted 및 date_edited 필드가 있습니다. – Roeland

+0

하나의 쿼리 여야합니까? 당신이 그것을 두 개로 나눈다면 훨씬 더 쉬울 것입니다. 고양이 ID (또는 이름들), 그들의 카운트 그리고 그들의 최대 포스트 날짜를 얻기위한 것, 그리고 다른 하나는 실제 게시물을 얻는 것입니다. – CheeseConQueso

답변

2

질문을 올바르게 읽으면 범주의 게시물 개수, 해당 범주의 최신 게시물 수를 찾고 있습니다. 아마도 laurent-rpnet의 대답을 단순화하면 트릭을 할 수 있습니다. ...

SELECT c.forum_cat_id, 
     COUNT(p.fk_forum_cat_id), 
     MAX(p.date_added), 
     (SELECT p2.post_title 
      FROM forum_post AS p2 
      WHERE p2.forum_cat_id = c.forum_cat_id 
      ORDER BY date_added DESC 
      LIMIT 1) 
    FROM forum_cat AS c INNER JOIN 
       forum_post AS p ON p.fk_forum_cat_id = c.forum_cat_id 
    GROUP BY c.forum_cat_id; 
+0

좋은 지적 +1! 나는 그런 것을 찾고 있었지만 그것을 상상할 수 없었다. 'Order bY date ... Limit 1'은 내 하위 쿼리를 행복하게 대체 할 것이며 아마도 자동 증가 된 ID에 의존하지 않고 더 빠를 것입니다. – laurent

0

당신은 당신의 문제에이 예제를 적용 할 수 있습니다 :

SELECT * 
FROM `test_post` AS p3 
JOIN (

SELECT MAX(id) AS id 
FROM `test_post` AS p1 
JOIN (

SELECT MAX( `test_post`.date) AS DATE, cat 
FROM `test_post` 
GROUP BY cat 
) AS p2 ON p1.date = p2.date 
AND p1.cat = p2.cat 
GROUP BY p1.cat 
) AS p4 ON p3.id = p4.id; 
1

forum_post 기본 키는 자동 증가가 (수 있지만, 우리가 ... 알고해서는 안)이 반환합니다 경우 당신이 필요 :

  • forum_cat_id = forum _cat PRIMAR :

    SELECT c.forum_cat_id, COUNT(p.fk_forum_cat_id), MAX(p.date_added), 
        (SELECT p2.post_title FROM forum_post AS p2 
         WHERE p2.forum_post_id = (SELECT MAX(p3.forum_post_id) FROM forum_post AS p3 
          WHERE p3.fk_forum_cat_id = p2.fk_forum_cat_id) AND p2.fk_forum_cat_id = c.forum_cat_id) 
    FROM forum_cat AS c INNER JOIN 
        forum_post AS p ON p.fk_forum_cat_id = c.forum_cat_id 
    GROUP BY c.forum_cat_id; 
    
    나는 몇 가지 필드 이름을 추측했다 Y 키
  • forum_post_id = forum_post 기본 키
  • post_title = 게시물 제목 또는 forum_post 포스트 텍스트의 태초 (당신이 보여주고 싶은에 따라 달라집니다).
  • COUNT(p.fk_forum_cat_id) 열 카테고리 당신은 내가 그것은 경우에 당신이 그것을 필요합니다 생각하는, 당신이 카테고리에서 최신 게시물의 날짜를 얻을 것이다 무엇을 요구뿐만 아니라

의 게시물 개수가 포함됩니다 좋은 포럼;).

Obs : 디버깅이 필요할 수 있으므로 테스트하지 않았습니다. 문제가 있으면 알려주세요.

+0

대신에'date_edited'를 사용할 수 있습니다 원하는 경우 'date_added'를 – laurent

0

일을 동적으로 계산하는 쿼리는 매우 빨리 느려지고 많은 CPU를 소비합니다. 좋은 인덱스가 있더라도 MySQL은 모든 행을 세는 데 매번 많은 작업을해야합니다.

이와 같은 쿼리의 대안은 forum_cat 테이블의 게시물 수를 요약하는 것입니다. posts_count과 같은 이름의 열을 만듭니다. 게시물이 생성 될 때마다 쿼리를 실행하거나 카운트를 감소시키는 것이 쉽습니다.

UPDATE forum_cat SET posts_count = posts_count + 1;

첫 페이지를 만들면 쿼리가 훨씬 간단 해지고 효율적입니다.

+0

사실! 백작은 느리지 만 각 고양이의 마지막 게시물을 찾는 것이이 검색어에 대한 어려운 작업입니다. 'forum_cat'에 단지 게시물 개수를 유지하는 것은이 부분에서 도움이되지 않습니다. 이 방법을 사용하면 마지막 'post_id'를 유지해야하며 쿼리가 훨씬 간단하고 빠를 것이라고 생각합니다. 이것은 포럼의 크기에 달려 있지만 고양이의 수가 합리적이어야하고 쿼리가 빨리 수행 될 것으로 믿습니다. Chris Henry 제안 (마지막'post_id '추가)은 Delete 및 Insert 트리거와 유지 보수 쿼리를 사용하여 무언가가 잘못되어 값이 올바르지 않을 때 값을 수정할 수 있습니다. – laurent

관련 문제