这两个查询如何结合起来?

时间:2013-03-13 18:43:04

标签: mysql

对于糟糕的问题标题感到抱歉,我不确定用正确的术语来描述我的要求。

我有两张桌子:

帖子:

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. 相应帖子的评论数
  3. 我可以用这样的查询做第一部分(假设“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

3 个答案:

答案 0 :(得分: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

我在你的小提琴中证实了这一点

答案 1 :(得分:0)

如果您想要左侧表中的所有行,则使用LEFT_JOIN,但右侧表中可能没有相应的行。否则你想要一个直(内)连接。此外,当使用像COUNT()这样的聚合函数时,如果选择了任何非聚合列,则必须使用GROUP_BY子句。

答案 2 :(得分:-1)

SELECT p.p_id,p.p_text,count(pc.pc_id)AS Count
FROM posts p,post_comments pc
WHERE pc.pc_p_id = p.p_id
AND p.p_author = 1
AND pc.pc_p_id = 12