2013-03-13 110 views
1

對不起,問題標題,我不確定描述我問的正確術語。這兩個查詢如何組合?

我有兩個表:

帖子:

p_id | p_author | p_text 

post_comments:

pc_id | pc_p_id | pc_author | pc_text 

爲每個評論的pc_p_id對應於樁的p_id的。

我想選擇:

  1. 所有職位的的p_id和p_text從特定作者
  2. 的意見爲相應的崗位

我可以做的第一數部分與這樣的查詢(假設「1」是作者):

SELECT p_id, p_text FROM posts WHERE p_author = 1 

而且我可以得到對於特定的帖子是這樣評論的數量(假設「12」是一個後ID):

SELECT COUNT(*) FROM post_comments WHERE pc_p_id = 12 

我的問題是,我怎麼能結合這兩個查詢,這樣我得到的所有的p_id和p_text特定作者的帖子以及相應帖子的評論數量?

我嘗試使用LEFT JOIN類似以下,但它給了我一個語法錯誤:

SELECT t1.p_id, t1.p_text, t2.COUNT(*) 
FROM posts t1 LEFT JOIN post_comments t2 
WHERE t1.p_author = 1 AND t2.pc_p_id = t1.p_id 
ORDER BY t1.p_id DESC 

這裏是SQL小提琴:

http://sqlfiddle.com/#!2/e9b975

+0

你可以搭起一個[小提琴](http://sqlfiddle.com)? – hd1 2013-03-13 18:46:34

+0

這兩張表格有什麼關係? p_author和pc_author是否相同? – Melanie 2013-03-13 18:47:48

+0

@Melanie - 我更新了我的問題。每個評論的pc_p_id對應於帖子的p_id。不,p_author和pc_author不是等價的。 – Nate 2013-03-13 18:49:11

回答

1
SELECT p_id, p_text, count(1) 
FROM posts p 
    JOIN post_comments pc 
    ON p.p_id = pc.pc_p_id 
WHERE p_author = 1 
GROUP BY p_id, p_text 

這裏是進行嵌入式選擇的編輯版本:

SELECT p_id, p_text, 
    (SELECT COUNT(1) FROM post_comments WHERE pc_p_id = p.p_id) AS count 
FROM posts p 
WHERE p_author = 1 

我在您的小提琴中驗證了這一點

+0

謝謝,這類作品,但它不返回沒有評論的帖子。 SQL小提琴:http://sqlfiddle.com/#!2/e9b975 – Nate 2013-03-13 19:16:59

+0

只需更改爲左外部連接 – iGanja 2013-03-13 19:24:27

+0

像這樣? http://sqlfiddle.com/#!2/e9b975/17。它幾乎可以工作,但當註釋數量實際爲「0」時,它會返回第二個帖子的「1」。所以有些東西不能正常工作。 – Nate 2013-03-13 19:52:31

0

當您想要左手錶中的所有行,但右手錶中可能沒有對應的行時,使用LEFT_JOIN。否則,你想要一個直的(內部)連接。另外,當使用像COUNT()這樣的聚合函數時,如果選擇了任何非聚合列,則必須使用GROUP_BY子句。

+0

儘管在右側表中可能沒有行。這就像一個博客,作者可以發佈帖子,然後其他人可以發表評論。一篇文章可能會有也可能沒有相應的評論。 – Nate 2013-03-13 18:53:22

+1

然後左連接是適當的,但仍然需要一個group by子句。 – Adrian 2013-03-13 19:02:09

-1

SELECT p.p_id,p.p_text,計數(pc.pc_id)AS計數
來自帖子P,post_comments PC
WHERE pc.pc_p_id = p.p_id
AND p.p_author = 1
AND pc.pc_p_id = 12