代码之家  ›  专栏  ›  技术社区  ›  Morten Christiansen

SQL:获取所有带有任何注释的帖子

  •  1
  • Morten Christiansen  · 技术社区  · 17 年前

    id、标题、文本

    id、名称、文本、帖子id

    通过“post_id”键检索具有一个或多个注释的所有帖子的标题的(单个)SQL语句是什么样子的?如果DBMS与SQL查询有任何关联,那么它就是MySQL。

    7 回复  |  直到 17 年前
        1
  •  7
  •   Nick DeVore    17 年前
    选择p.caption,count(c.id)
    从posts p连接评论c on p.id=c.post\u id
    按标题分组
        2
  •  3
  •   FlySwat    17 年前
    SELECT DISTINCT p.caption, p.id
        FROM posts p, 
             comments c 
        WHERE c.post_ID = p.ID 
    

    我认为使用连接要比使用IN子句或子查询快得多。

        3
  •  0
  •   James    17 年前
    SELECT DISTINCT caption
    FROM posts
        INNER JOIN comments ON posts.id = comments.post_id
    

    忘记计数和子查询。

    内部联接将拾取所有具有有效帖子的评论,并排除所有具有0条评论的帖子。DISTINCT将合并超过1条注释的帖子的重复标题条目。

        4
  •  0
  •   Ian Varley    17 年前

    我发现在这种情况下,这种语法最具可读性:

    SELECT * FROM posts P 
      WHERE EXISTS (SELECT * FROM Comments WHERE post_id = P.id)
    

    它比这个线程中的大多数其他线程更好地表达了您的意图——“给我所有的帖子…”(选择*来自帖子)“…有任何评论”(如果存在(选择*来自评论…)。它本质上与上面的连接相同,但是因为您实际上没有进行连接,所以您不必担心在post中获得重复的记录,因此每个post只会获得一条记录。

        5
  •  0
  •   akmozo    4 年前
    SELECT caption FROM posts 
    INNER JOIN comments ON comments.post_id = posts.id 
    GROUP BY posts.id;
    

    不需要打电话 having count()

    编辑:应该是一个 inner join 当然(如果评论是孤立的,为了避免空值),这要感谢jishi。

        6
  •  -1
  •   lomaxx    17 年前

    我脑子里想的太多了,但可能是这样的:

    SELECT caption FROM posts WHERE id IN (SELECT post_id FROM comments HAVING count(*) > 0)
    
        7
  •  -2
  •   hark    17 年前

    SELECT p.caption FROM posts p WHERE (SELECT COUNT(*) FROM comments c WHERE c.post_id=p.id) > 1;

    这具有运行 SELECT COUNT(*) posts表中每行的子查询。根据表的大小,可以考虑添加一个附加列, comment_count posts comments ,这样你就可以

    SELECT p.caption FROM posts p WHERE comment_count > 1