2012-02-09 92 views
1

我有2個表:如何查找SQL中給定文章的評論數量和評論數量?

  • 審查(包括content_type_idOBJECT_ID
  • 評論(包括content_type_idOBJECT_ID

的組合 「content_type_id和OBJECT_ID」 唯一定義一個實體(如文章等)


現在我想一個SQL查詢寫到:

「列表中的所有文章與他們的'review_count'和'comment_count'「。

我的意思是最後的結果,我想要的是:

content_type_id | object_id | review_count | comment_count

我該如何實現這個.. ??

+2

Ramandeep。您已對原始問題進行了重大編輯,將其從3個表更改爲2個表,刪除FK約束並更改要查找的結果集中的列。我相信我的答案正確而完整地回答了你原來的問題。 – 2012-02-09 14:06:20

+1

是的,你已經完全重新定義了這個問題。不酷。此外,你在下面有很多評論,說你想包括'article_id'。 – RedFilter 2012-02-09 15:23:38

+0

是的史蒂芬..你的回答是正確的以前的情況.. !! .. thanx .. !! ..和那些意見是在我修改問題之前添加的..並且對於修改問題感到抱歉..但是我認爲我的場景與我之前描述的類似,所以我會通過答案解決它..再次嘗試..但請你現在可以回答.. !! – 2012-02-09 16:24:10

回答

2

(編輯後的問題改變我發現一個數據錯誤)

試試這個:

select 
    content_type_id, object_id, 
    sum(review_count) review_count, 
    sum(comment_count) comment_count 
from 
    (
     select 
      content_type_id, object_id, count(*) review_count 
     from jc_reviews 
     group by 1, 2 
    ) as r_count 
    full outer join 
    ( 
     select content_type_id, object_id, count(*) comment_count 
     from jc_comments 
     group by 1, 2 
    ) as c_count 
    using (content_type_id, object_id) 
group by 1, 2 

它不使用中央表(以前稱爲article)。這意味着,沒有任何評論和沒有任何評論的項目將不會顯示在結果中。至少有一條評論或一條評論的項目會顯示出來。

+0

它不工作在我的情況....我有一點點不同的情況類似於這...我已經更新了我的問題...抱歉沒有提及整個情況...請幫助..! – 2012-02-09 11:40:00

+0

我也試過你的方法來填充結果..對於我的場景...但它不工作....我寫了下面的查詢:「select coalesce(r.content_type_id,c.content_type_id)content_type_id,coalesce(r。的object_id,c.object_id)的object_id, 計數(r.id)REVIEW_COUNT, 計數(從 jc_reviews c.id)COMMENT_COUNT ř使用(content_type_id,的object_id) 組由content_type_id,OBJECT_ID 全外連接jc_comments℃;」 – 2012-02-09 11:41:34

+0

@RamandeepSingh:如果你a)在航班中途不改變航線,b)如果你想說明問題是什麼,這將有所幫助。這樣,如果你得到錯誤的數據,或者如果你有單純的語法問題,我不知道。 – 2012-02-09 15:59:23

1
SELECT article_id, article_name, 
(
    select count(review_id) 
    from review 
    where article_id = a.articles 
) review_count, 
(
    select count(comments _id) 
    from comments 
    where article_id = a.articles 
) comment_count 
FROM articles a 
1

關閉我的頭頂,但我認爲這是可行的:

SELECT 
article_id, 
article_name, 
count(review_id) as review_count, 
count(comment_id) as comment_count 
FROM articles a, reviews b, comments c 
WHERE 
a.article_id = b.article_id OR 
a.article_id = c.article_id 

這將去只是爲了與審查和/或評論文章。不使用左連接就可以獲得。

+0

你會想要做一個'count(distinct)',並且拋出'group by'。 – 2012-02-09 05:27:28

+0

我想要的是:一張只包含「article_id | review_count | comment_count」....並且沒有與Articles表聯接的表。每當我需要查看文章,我會自己加入一個連接..現在告訴我如何實現這個.. ?? – 2012-02-09 06:53:01

1
select a.article_id, 
    coalesce(rc.review_count, 0) as review_count, 
    coalesce(cc.comment_count, 0) as comment_count 
from articles a 
left outer join (
    select article_id, count(*) as review_count 
    from review 
    group by article_id 
) rc on a.article_id = rc.article_id 
left outer join (
    select article_id, count(*) as comment_count 
    from comments 
    group by article_id 
) cc on a.article_id = cc.article_id 
+0

我想要的是:一張只包含「article_id | review_count | comment_count」....並且沒有與Articles表聯接的表。每當我需要查看文章,我會自己加入一個連接..現在告訴我如何實現這個.. ?? – 2012-02-09 06:52:45

+0

@RamandeepSingh我加入了Articles表,以防文章沒有評論或評論。這可以讓你爲這些計數顯示一個零。否則,文章將不會顯示在結果中。請指定所需的行爲。 – RedFilter 2012-02-09 15:22:07

1

我會通過保持一致的命名約定在我的表開始,並保持在單數

SELECT article_id = a.article_id 
     ,review_count = COUNT(DISTINCT(r.review_id)) 
     ,comment_count = COUNT(DISTINCT(c.comment_id)) 
    FROM article a 
    LEFT OUTER JOIN review r 
    ON a.article_id = r.article_id 
    LEFT OUTER JOIN comment c 
    ON a.article_id = c.article_id 
GROUP BY a.article_id 

這裏他們所有命名的一些測試數據一起玩:

-- Create tables 
CREATE TABLE article(article_id INT) 
CREATE TABLE review(review_id INT, article_id INT) 
CREATE TABLE comment(comment_id INT, article_id INT) 

-- Create some test data 
INSERT INTO article SELECT 1 
INSERT INTO article SELECT 2 
INSERT INTO article SELECT 3 

INSERT INTO review SELECT 10, 1 
INSERT INTO review SELECT 20, 2 
INSERT INTO review SELECT 30, 2 
INSERT INTO review SELECT 40, 3 
INSERT INTO review SELECT 50, 3 
INSERT INTO review SELECT 60, 3 

INSERT INTO comment SELECT 200, 1 
INSERT INTO comment SELECT 300, 1 
INSERT INTO comment SELECT 400, 2 
INSERT INTO comment SELECT 500, 2 
INSERT INTO comment SELECT 600, 3 

後你大大改變了你的問題,我相信這個查詢會給你一個答案:

SELECT u.content_type_id 
     ,u.object_id 
     ,review_count = SUM(u.review_count) 
     ,comment_count = SUM(u.comment_count) 
    FROM 
    (
    SELECT content_type_id 
      ,object_id 
      ,review_count = COUNT(*) 
      ,comment_count = 0 
     FROM review 
    GROUP BY content_type_id, object_id 
    UNION 
    SELECT content_type_id 
      ,object_id 
      ,review_count = 0 
      ,comment_count = COUNT(*) 
     FROM comment 
    GROUP BY content_type_id, object_id 
    ) u 
GROUP BY u.content_type_id, u.object_id 

這裏是一些測試數據一起工作:

CREATE TABLE review(review_id INT, content_type_id INT, object_id INT) 
CREATE TABLE comment(comment_id INT, content_type_id INT, object_id INT) 

INSERT INTO review SELECT 11, 10, 100 
INSERT INTO review SELECT 12, 10, 100 
INSERT INTO review SELECT 13, 20, 100 
INSERT INTO review SELECT 13, 10, 200 
INSERT INTO review SELECT 13, 30, 100 
INSERT INTO comment SELECT 21, 10, 100 
INSERT INTO comment SELECT 22, 20, 100 
INSERT INTO comment SELECT 23, 20, 100 
INSERT INTO comment SELECT 24, 20, 100 
INSERT INTO comment SELECT 25, 10, 200 
INSERT INTO comment SELECT 26, 10, 200 
+0

我想要的是:一張只包含「article_id | review_count | comment_count」的表格,不包含與Articles表格的連接。每當我需要查看文章,我會自己加入一個連接..現在告訴我如何實現這個.. ?? – 2012-02-09 07:08:52

+0

語法'review_count = COUNT(*)'來自哪裏? PostgreSQL不支持這個,這裏的語法是'COUNT(*)review_count'。 – 2012-02-09 16:36:37

1

試試這個:

SELECT a.Article_ID, 
     COUNT(b.Article_ID) as ReviewCount, 
     COUNT(c.Article_ID) as CommentCount 
FROM Articles a JOIN Review b ON 
     a.Article_ID = b.Article_ID 
    LEFT JOIN Comments c ON 
     a.Article_ID = c.Article_ID 
GROUP BY a.Article_ID 
+0

我想要的是:一個只包含「article_id | review_count | comment_count」....並且不與JOIN表聯接的表。每當我需要查看文章,我會自己加入一個連接..現在告訴我如何實現這個.. ?? – 2012-02-09 08:07:25