2014-12-21 23 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. 如何在post_related表中插入記錄以顯示相關帖子時選擇ap關節柱。

    我想是這樣,但它表明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_tags的字符串(例如,作爲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的錯誤消息。只有一個想法可以使用我在之前的查詢中顯示的連接(包含blog_comment表)來避免帶有total_comments的子查詢。

但是這個過程/查詢做了一些不同於應該問的問題。 (它甚至沒有任何對博客相關表的引用。)

+0

是的,這個過程不屬於blog_related表。我不知道如何在創建新帖子時如何在blog_related表格中插入記錄以及如何將它們顯示爲相關帖子。 –

+0

它似乎太微不足道了,但插入post_related(post_id,post_related_id)值(<<帖子的ID >>,<<相關帖子的ID >>)的問題是什麼?您只需確保'id'列是自動增加的,並且您需要知道相關帖子的ID。當然,後一個取決於您的工作流程... –

+0

先生感謝您的支持,但您的建議查詢post_category,post_tag表的作用是什麼,因爲這些表是連接表並根據特定類別進行搜索。 –