Sql 三方循环查询胜负查询

Sql 三方循环查询胜负查询,sql,postgresql,Sql,Postgresql,给这张桌子 记录 win loss rid 1 2 1 2 3 2 3 1 3 rid是自动递增的唯一id。赢/输中的值是唯一的玩家id,如1,2,3,其中1,2,3表示唯一的玩家 1胜2。2比3。3比1。我想知道记录表中有多少 也就是说,A赢了B,B赢了C,C赢了A,至少一次 我在下面尝试过,但当我需要计数为1时,它输出计数为3 SELECT count(*) FROM record r1, record r2, record r3 WHERE r1.w

给这张桌子

记录

win loss  rid
1   2     1
2   3     2
3   1     3
rid是自动递增的唯一id。赢/输中的值是唯一的玩家id,如1,2,3,其中1,2,3表示唯一的玩家

1胜2。2比3。3比1。我想知道记录表中有多少

也就是说,A赢了B,B赢了C,C赢了A,至少一次

我在下面尝试过,但当我需要计数为1时,它输出计数为3

SELECT count(*)
FROM record r1, record r2, record r3
WHERE r1.win = r2.loss 
AND r2.win = r3.loss
AND r3.win = r1.loss;


-----
count
3

不确定如何执行此操作实际上,您当前查找三向循环的逻辑是正确的。唯一的问题是,你的逻辑是选择一个给定的三方循环,以三个参与者中的每一个作为起点。也就是说,您在每个循环中重复计算了2次。因此,您只需将计数除以3即可获得正确的循环数:

SELECT COUNT(*) / 3 AS cnt
FROM record r1
INNER JOIN record r2 ON r1.win = r2.loss
INNER JOIN record r3 ON r2.win = r3.loss AND r3.win = r1.loss

事实上,您当前寻找三向循环的逻辑是正确的。唯一的问题是,你的逻辑是选择一个给定的三方循环,以三个参与者中的每一个作为起点。也就是说,您在每个循环中重复计算了2次。因此,您只需将计数除以3即可获得正确的循环数:

SELECT COUNT(*) / 3 AS cnt
FROM record r1
INNER JOIN record r2 ON r1.win = r2.loss
INNER JOIN record r3 ON r2.win = r3.loss AND r3.win = r1.loss

蒂姆的推理是正确的。然而,我不会过度计算和划分。相反,我将只查找由ID排序的循环:

SELECT COUNT(*) AS cnt
FROM record r1 JOIN
     record r2
     ON r1.win = r2.loss
     record r3
     ON r2.win = r3.loss AND
        r3.win = r1.loss
WHERE r1.win < r1.loss AND
      r2.win < r2.loss;
选择COUNT(*)作为cnt
从记录r1加入
记录r2
在r1.win=r2.loss时
记录r3
在r2.win=r3.loss和
r3.赢=r1.输
其中r1.win
蒂姆的推理是正确的。然而,我不会过度计算和划分。相反,我将只查找由ID排序的循环:

SELECT COUNT(*) AS cnt
FROM record r1 JOIN
     record r2
     ON r1.win = r2.loss
     record r3
     ON r2.win = r3.loss AND
        r3.win = r1.loss
WHERE r1.win < r1.loss AND
      r2.win < r2.loss;
选择COUNT(*)作为cnt
从记录r1加入
记录r2
在r1.win=r2.loss时
记录r3
在r2.win=r3.loss和
r3.赢=r1.输
其中r1.win