2014-12-21 4 views
0

내가있는 나는 다음과 같은 테이블 구조를 사용하고 블로그 포스트 시스템을 만드는 오전 : - 단일 쿼리에서 두 개의 표를 사용 하시겠습니까?

blog_category 
category_id, category_name, enabled, created_date 

blog_post 
post_id,title,article, author_id,date_published 

post_category 
category_id, post_id 

blog_tag 
tag_id, tag_name 

post_tag 
id,tag_id,post_id 

post_related 
id, post_id, post_related_id 

blog_comment 
comment_id, post_id, is_reply_to_id,comment,user_id 

내 질문

은을 : 하나의 쿼리에서 출력의이 유형을 얻는 방법

  1. title,author_name,article,total_comments,post_tags

  2. ap를 선택하면 관련 게시물을 표시하기 위해 post_related 테이블에 레코드를 삽입하는 방법 관절 기둥.

    것은이 같은 노력하지만 보여 unknown column bp.post_id

    CREATE PROCEDURE blog_get_posts_in_category(
        IN inCategoryId INT, IN inShortPostDescriptionLength INT, 
        IN inPostsPerPage INT, IN inStartItem INT) 
        BEGIN 
        PREPARE statement FROM 
        "SELECT bp.post_id, bp.title,(select count(*) from blog_comment where post_id=bp.post_id) as total_comments, 
        IF(LENGTH(bp.article) <= ?, 
        bp.article, 
        CONCAT(LEFT(bp.article, ?), 
        '...')) AS article, 
        DATE_FORMAT(bp.date_published,'%d %M %Y at %h:%i:%s %p') as date_published, bp.banner_image,ba.display_name  
        FROM blog_post bp 
        INNER JOIN blog_post_to_category bpc 
        ON bpc.post_id = bp.post_id  
        INNER JOIN blog_author ba 
        ON ba.id = bp.author_id 
        WHERE bpc.category_id = ? and enabled=1 
        ORDER BY bp.post_id DESC 
        LIMIT ?, ?"; 
        SET @p1 = inShortPostDescriptionLength; 
        SET @p2 = inShortPostDescriptionLength; 
        SET @p3 = inCategoryId; 
        SET @p4 = inStartItem; 
        SET @p5 = inPostsPerPage; 
        EXECUTE statement USING @p1, @p2, @p3, @p4, @p5; 
        END$$ 
    

답변

0

Q1 :

이 너무 있다고 가정 할 수 있습니다 질문에서 정말 명확하지 않다 - blog_author 테이블 author_id처럼 보인다, author_name, ... - total_comments는 블로그 게시물에 속한 모든 댓글의 수입니다. - post_tags는 블로그 게시물과 관련된 모든 post_tag (예 : csv)를 포함하는 하나의 문자열 일 수 있습니다.

다음, 쿼리 수 :

SELECT 
    bp.post_id as pid, bp.title, a.author_name, bp.article, bc.total_comments, pt.post_tags 
FROM blog_post bp 
LEFT JOIN blog_author a ON bp.author_id=a.id 
LEFT JOIN (
    SELECT post_id, COUNT(*) as total_comments 
    FROM blog_comment 
    GROUP BY post_id) bc 
    ON bc.post_id=bp.post_id 
LEFT JOIN (
    SELECT post_id, GROUP_CONCAT(DISTINCT tag_id SEPARATOR ',') AS post_tags 
    FROM post_tag 
    GROUP BY post_id) pt 
    ON pt.post_id=bp.post_id; 

Q2 : 여기

쿼리가 확인 될 것으로 보인다. 심지어 직접 시도해 보았고 bp.post_id에 대한 오류 메시지도 표시되지 않았습니다. total_comments가있는 하위 쿼리가 이전 쿼리에서 보여주는 조인 (blog_comment 테이블 사용)을 사용하여 피할 수 있다는 한 가지 생각.

그러나이 절차/쿼리는 예상되는 질문과 다른 것을 수행합니다. (blog_related 테이블에 대한 참조조차 없습니다.)

+0

예이 절차는 blog_related 테이블에 속하지 않습니다. 나는 새 게시물을 만들 때 blog_related 테이블에 레코드를 삽입하는 방법과 관련 게시물로 다시 표시하는 방법을 알지 못합니다. –

+0

너무 사소한 것 같지만'insert post_related (post_id, post_related_id) 값의 문제점은 무엇입니까? (<< 포스트의 ID >><< 관련 포스트의 ID >>) ??? 당신은'id' 칼럼이 자동 증가되고 당신이 관련된 글의 ID를 알아야 할 필요가 있습니다. 후자는 워크 플로우에 따라 달라집니다 ... –

+0

선생님 친절한 지원에 감사하지만 제안 된 쿼리 post_category, post_tag 테이블의 역할은이 테이블이 연결 테이블이며 특정 카테고리를 기반으로 검색 되었기 때문에 무엇입니까? –

관련 문제