Php 评分系统中往复投票的查找方法

Php 评分系统中往复投票的查找方法,php,sql,mariadb,rating-system,Php,Sql,Mariadb,Rating System,我有一个主动投票系统,基本上可以归结为一个数据库表,有“votefrom”和“voteto”列 基本上,我正在尝试建立一个能够检测虐待行为的警报系统。如果找到一种方法来检测往复投票(倾向于主要为彼此投票的人),或者可能是一组这样的投票,就会出现这种情况 理想的结果是一个用户列表,在每个用户旁边,有一个匹配的用户和一个百分比,显示例如用户a对用户B的投票率为10%。这显然是按降序排列的,因此最倾向于专门为另一个用户投票的用户排在首位 所以,我的问题是,这仅在查询中是可能的,还是SQL可以让我走多远

我有一个主动投票系统,基本上可以归结为一个数据库表,有“votefrom”和“voteto”列

基本上,我正在尝试建立一个能够检测虐待行为的警报系统。如果找到一种方法来检测往复投票(倾向于主要为彼此投票的人),或者可能是一组这样的投票,就会出现这种情况

理想的结果是一个用户列表,在每个用户旁边,有一个匹配的用户和一个百分比,显示例如用户a对用户B的投票率为10%。这显然是按降序排列的,因此最倾向于专门为另一个用户投票的用户排在首位

所以,我的问题是,这仅在查询中是可能的,还是SQL可以让我走多远

有指向现有实现的指针吗?(最好是PHP)

仅作为示例(使用MS SQL Server),但适用于任何支持COUNT()OVER()的SQL变体

查询:

select distinct
       votefrom
     , voteto
     , count(*) over(partition by votefrom, voteto) fromto
     , count(*) over(partition by votefrom) fromtot
     , count(*) over(partition by votefrom, voteto) * 100 / count(*) over(partition by votefrom) pct
from mytable
+----+----------+--------+--------+---------+-----+
|    | votefrom | voteto | fromto | fromtot | pct |
+----+----------+--------+--------+---------+-----+
|  1 |      100 |    200 |      5 |      10 |  50 |
|  2 |      100 |    300 |      1 |      10 |  10 |
|  3 |      100 |    400 |      1 |      10 |  10 |
|  4 |      100 |    500 |      1 |      10 |  10 |
|  5 |      100 |    600 |      1 |      10 |  10 |
|  6 |      100 |    700 |      1 |      10 |  10 |
+----+----------+--------+--------+---------+-----+
结果:

select distinct
       votefrom
     , voteto
     , count(*) over(partition by votefrom, voteto) fromto
     , count(*) over(partition by votefrom) fromtot
     , count(*) over(partition by votefrom, voteto) * 100 / count(*) over(partition by votefrom) pct
from mytable
+----+----------+--------+--------+---------+-----+
|    | votefrom | voteto | fromto | fromtot | pct |
+----+----------+--------+--------+---------+-----+
|  1 |      100 |    200 |      5 |      10 |  50 |
|  2 |      100 |    300 |      1 |      10 |  10 |
|  3 |      100 |    400 |      1 |      10 |  10 |
|  4 |      100 |    500 |      1 |      10 |  10 |
|  5 |      100 |    600 |      1 |      10 |  10 |
|  6 |      100 |    700 |      1 |      10 |  10 |
+----+----------+--------+--------+---------+-----+
见:


MySQL中的语法将大不相同,而dbms不支持COUNT()OVER()

SQL可以让您走得更远。除此之外,你的问题太宽泛了。我建议你删除它。然后问另一个问题,提供示例数据,并解释您希望从中得到什么结果。我用更具体的预期结果编辑了我的问题。哪个数据库供应商?每个版本都有不同的sql变体,具有不同的功能和语法。如果您有与sql相关的问题,建议您始终指示dbms。添加“样本数据”和“预期结果”将大大有助于完善这个问题Mariadb 10.2 GASee:太好了。我将使用MariaDB 10.2,它支持COUNT()作为一个窗口函数,因此我认为它会有点类似。这就是为什么需要在问题标签中指定此类详细信息。