2013-02-06 57 views
0

我有一個簡單的文章和評論表。我想顯示文章及其評論。我想與一個選擇與評論和另一個選擇沒有在同一張桌子上的評論聯合。我有1條評論和文章編號2,沒有評論,文章編號3有2條評論。COUNT裏面UNION ALL導致跳過預期結果

在文章表:

articles.id | articles.content 
    1  | test article 
    2  | test another 
    3  | test third 

的意見表:

comments.id | comments.aid | comments.comment 
    1   | 1   | bad one 
    2   | 3   | very good 
    3   | 3   | good   

我用下面的查詢得到的結果。

SELECT articles.id AS article_id, 
comments.id AS comment_id, 
comment 
FROM articles 
LEFT JOIN comments ON comments.aid = articles.id 
UNION ALL 
SELECT articles.id AS article_id, 
NULL, 
NULL 
FROM articles 
GROUP BY article_id 
ORDER BY article_id DESC 

結果我得到的這是正確的:

article_id | comment_id | comment 
    3  | 3   | good 
    3  | 2   | very good 
    3  | NULL  | NULL 
    2  | NULL  | NULL 
    2  | NULL  | NULL 
    1  | NULL  | NULL 
    1  | 1   | bad one 

現在,如果我想我也加算到查詢計數的意見,並就變成:

SELECT articles.id AS article_id, 
comments.id AS comment_id, 
comment , 
COUNT(DISTINCT comments.id) AS count_comments 
FROM articles 
LEFT JOIN comments ON comments.aid = articles.id 
UNION ALL 
SELECT articles.id AS article_id, 
NULL, 
NULL , 
NULL 
FROM articles 
GROUP BY article_id 
ORDER BY article_id DESC 

現在加入計數列後結果發生變化,並且並非所有行都輸出:

article_id | comment_id | comment | count_comments 
    3  | NULL  | NULL  | NULL 
    2  | NULL  | NULL  | NULL 
    1  | NULL  | NULL  | NULL 
    1  | 1   | bad one | 3 

現在,除了第1條的註釋外,不顯示註釋,對於2選擇命令,ID(2)應該顯示兩次,而ID(3)應該顯示3次(第2次選擇命令爲1,而2第一個選擇命令,有2條評論)

,我希望正確的結果:

article_id | comment_id | comment | count_comments 
    3  | 3   | good  | 2 
    3  | 2   | very good | 2 
    3  | NULL  | NULL  | NULL 
    2  | NULL  | NULL  | NULL 
    2  | NULL  | NULL  | NULL 
    1  | NULL  | NULL  | NULL 
    1  | 1   | bad one | 1 

我不知道爲什麼加計導致的部份。

感謝

+0

好得多,如果你可以給樣本數據與表格格式所需的輸出。 –

+0

做一個單獨的查詢來獲得計數... –

+0

這不會是一個查詢,因爲我將不得不爲每個輸出行做它......如果在一個查詢中完成,它會好得多@nathanhayfield –

回答

1

當您添加count()它僅影響第一子查詢。所以,該子查詢只返回一行而不是多行。

我有今天上傳的SQL問題,但我想你想以這種形式的東西:

select articles.id AS article_id, comments.id AS comment_id, comment, 
     COUNT(DISTINCT comments.id) AS count_comments 
from ((subquery1) union all 
     (subquery2) 
    ) t 
group by article_id 
order by article_id desc 

我假設你正在試圖讓所有的物品包括在內。你不需要union all。第一個查詢就足夠了(因爲left join):

select articles.id AS article_id, comments.id AS comment_id, comment, 
     COUNT(DISTINCT comments.id) AS count_comments 
from articles left join 
    LEFT JOIN comments ON comments.aid = articles.id 
group by article_id 
ORDER BY article_id DESC 

在你說的結果是正確的,你有兩行的第2條,都與空值。這真的是你想要的嗎?如果你想補充一點,那麼order by之前把這個:

union all 
select distinct article_id, NULL, NULL, NULL 
from articles 
+0

是不是有沒有沒有子查詢的方式,因爲有大規模的性能打擊?謝謝:) –

+0

我使用的數據庫方案實際上比這更復雜...我只是把這個插圖。我需要使用聯盟。 –

+0

@MichaelSamuel。 。 。見最後一部分。只要使用該聯合的查詢全部結束(以及末尾的「order by」)。但是,查看故意生成重複的查詢是非常不尋常的。 –