SQL查找倒数关系

标签 sql sql-server select sql-server-2017 dataexplorer

我正在尝试使用 Stack Exchange Data Explorer (SEDE) 查找一种情况,其中 Stack Overflow 上的两个不同用户已接受彼此的答案。例如:

Post A { Id: 1, OwnerUserId: "user1", AcceptedAnswerId: "user2" }

Post B { Id: 2, OwnerUserId: "user2", AcceptedAnswerId: "user1" }

我目前有一个查询,可以找到两个作为提问者-回答者在多个问题上协作的用户,但它无法确定这种关系是否是互惠的:

SELECT user1.Id AS User_1, user2.Id AS User_2
FROM Posts p
INNER JOIN Users user1 ON p.OwnerUserId = user1.Id
INNER JOIN Posts p2 ON p.AcceptedAnswerId = p2.Id
INNER JOIN Users user2 ON p2.OwnerUserId = user2.Id
WHERE p.OwnerUserId <> p2.OwnerUserId
AND p.OwnerUserId IS NOT NULL
AND p2.OwnerUserId IS NOT NULL
AND user1.Id <> user2.Id
GROUP BY user1.Id, user2.Id HAVING COUNT(*) > 1;

对于不熟悉架构的人来说,有两个表,如下所示:

Posts
--------------------------------------
Id                      int
PostTypeId              tinyint
AcceptedAnswerId        int
ParentId                int
CreationDate            datetime
DeletionDate            datetime
Score                   int
ViewCount               int
Body                    nvarchar (max)
OwnerUserId             int
OwnerDisplayName        nvarchar (40)
LastEditorUserId        int
LastEditorDisplayName   nvarchar (40)
LastEditDate            datetime
LastActivityDate        datetime
Title                   nvarchar (250)
Tags                    nvarchar (250)
AnswerCount             int
CommentCount            int
FavoriteCount           int
ClosedDate              datetime
CommunityOwnedDate      datetime

还有

Users
--------------------------------------
Id                      int
Reputation              int
CreationDate            datetime
DisplayName             nvarchar (40)
LastAccessDate          datetime
WebsiteUrl              nvarchar (200)
Location                nvarchar (100)
AboutMe                 nvarchar (max)
Views                   int
UpVotes                 int
DownVotes               int
ProfileImageUrl         nvarchar (200)
EmailHash               varchar (32)
AccountId               int

最佳答案

最简单形式的查询(这样查询 16M 问题就不会超时)是:

WITH accepter_acceptee(a, b) AS (
    SELECT q.OwnerUserId, a.OwnerUserId
    FROM Posts AS q
    INNER JOIN Posts AS a ON q.AcceptedAnswerId = a.Id
    WHERE q.PostTypeId = 1 AND q.OwnerUserId <> a.OwnerUserId
), collaborations(a, b, type) AS (
    SELECT a, b, 'a accepter b' FROM accepter_acceptee
    UNION ALL
    SELECT b, a, 'a acceptee b' FROM accepter_acceptee
)
SELECT a, b, COUNT(*) AS [collaboration count]
FROM collaborations
GROUP BY a, b
HAVING COUNT(DISTINCT type) = 2
ORDER BY a, b

结果:

关于SQL查找倒数关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52561673/

相关文章:

mysql - 将特定列中具有相同值的行分组

mysql - 两个表中的匹配行并将它们显示为新行

SQL Server,查找不同列中的交叉值

excel vba选择列

sql - PostgreSQL 查询 - 临时表外的 AVG() 函数

php - 如何在一个以$ result原始值运行的while循环内为$ result分配一个新值?

sql - 删除临时表(如果存在)

sql-server - SQL Server 索引命名约定

mysql - 从 4 个不同的表中按日期排序

mysql - 我如何创建这个 mysql 选择查询?