在评级系统中寻找往复票的方法

时间:2017-07-02 18:27:55

标签: php sql mariadb rating-system

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

基本上,我正在尝试制定可以检测滥用的警报系统。一个这样的案例,如果找到一种方法来检测往复投票(倾向于主要投票的人),或者可能是这些投票的集群。

理想的结果将是用户列表,其中每个用户旁边都有匹配的用户和百分比,表明例如用户A正在对用户B进行10%的投票。这显然是按降序排列的,以便最倾向于专门为另一个用户投票的用户位于最佳位置。

所以,我的问题是,这在单独的查询中是否可行,或SQL可以在多大程度上得到我?

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

1 个答案:

答案 0 :(得分:1)

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

CREATE TABLE mytable(
   votefrom INTEGER
  ,voteto   INTEGER
);
INSERT INTO mytable(votefrom,voteto) VALUES (100,200);
INSERT INTO mytable(votefrom,voteto) VALUES (100,200);
INSERT INTO mytable(votefrom,voteto) VALUES (100,200);
INSERT INTO mytable(votefrom,voteto) VALUES (100,200);
INSERT INTO mytable(votefrom,voteto) VALUES (100,200);
INSERT INTO mytable(votefrom,voteto) VALUES (100,300);
INSERT INTO mytable(votefrom,voteto) VALUES (100,400);
INSERT INTO mytable(votefrom,voteto) VALUES (100,500);
INSERT INTO mytable(votefrom,voteto) VALUES (100,600);
INSERT INTO mytable(votefrom,voteto) VALUES (100,700);

<强>查询:

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 |
+----+----------+--------+--------+---------+-----+

请参阅:http://rextester.com/UESP57757

MySQL中的语法会有很大不同,而dbms不支持COUNT()OVER()