如何通过某些标签获取帖子和评论的用户数?

时间:2018-04-25 07:45:20

标签: sql-server dataexplorer

使用此dataexplorer查询:

select b.DisplayName as owner, a.N from
(select OwnerUserId, count(*) as N from Posts where (Tags like '%perl6%' or Tags like '%rakudo%' or (Tags like '%parrot%' and Tags like '%perl%')) group by OwnerUserId) as a,
(select Id, DisplayName from Users) as b
where a.OwneruserId = b.Id order by N desc;

我可以列出所有使用某个标签发布了一些问题的用户 但是,我还要列出已在该帖子中回复或评论过的用户。

我想它涉及使用Comment表,但是我不清楚如何从两个表合并UserIds。

1 个答案:

答案 0 :(得分:1)

请参阅the SEDE schema

  1. 按标签提问。
  2. 最好对Tags表使用测试,而不是在tags列上使用LIKE操作。前者可以快20倍。
  3. 使用问题列表,从步骤1获取答案。
  4. 同时使用问题列表和答案列表来获取评论。
  5. 请注意SEDE provides wonderful magic columns,例如[User Link]
  6. 总而言之,这是一种方式:

    WITH questsByTags AS (
        SELECT DISTINCT
                    q.Id
                    , q.OwnerUserId
        FROM        Posts q
        INNER JOIN  PostTags pt     ON q.Id = pt.PostId
        INNER JOIN  Tags t          ON t.Id = pt.TagId
        WHERE       q.PostTypeId    = 1  -- questions
        AND (
                t.TagName   = 'perl6'
            OR  t.TagName   = 'rakudo'
            OR (
                t.TagName   = 'parrot'
                AND EXISTS (
                    SELECT      * FROM PostTags pt2
                    INNER JOIN  Tags t2      ON  t2.Id = pt2.TagId
                    WHERE q.Id = pt2.PostId  AND t2.TagName = 'perl'
        )   )   )
    ),
    answersByTags AS (
        SELECT      a.Id
                    , a.OwnerUserId
        FROM        Posts a
        INNER JOIN  questsByTags qbt  ON qbt.Id = a.ParentId
    ),
    commntsByTags AS (
        SELECT      c.Id
                    , c.UserId  AS [OwnerUserId]
        FROM        Comments c
        INNER JOIN (
            SELECT              Id FROM questsByTags
            UNION ALL SELECT    Id FROM answersByTags
        ) AS allPosts
        ON allPosts.Id = c.PostId
    ),
    allUsers AS (
        SELECT          OwnerUserId FROM questsByTags
        UNION SELECT    OwnerUserId FROM answersByTags
        UNION SELECT    OwnerUserId FROM commntsByTags
    )
    SELECT      au.OwnerUserId      AS [User Link]
                , (SELECT Count (qbt.Id) FROM questsByTags  qbt WHERE qbt.OwnerUserId = au.OwnerUserId)  AS [Num Qsts]
                , (SELECT Count (abt.Id) FROM answersByTags abt WHERE abt.OwnerUserId = au.OwnerUserId)  AS [Num Ans]
                , (SELECT Count (cbt.Id) FROM commntsByTags cbt WHERE cbt.OwnerUserId = au.OwnerUserId)  AS [Num Cmmnts]
    FROM        allUsers au
    WHERE       au.OwnerUserId IS NOT NULL
    ORDER BY    [Num Qsts] DESC, [Num Ans] DESC, [Num Cmmnts] DESC
    

    您可以this SEDE link.

    中实时查看