我有一个主动投票系统,基本上归结为数据库表,其中列为“votefrom”和“voteto”。
基本上,我正在尝试制定可以检测滥用的警报系统。一个这样的案例,如果找到一种方法来检测往复投票(倾向于主要投票的人),或者可能是这些投票的集群。
理想的结果将是用户列表,其中每个用户旁边都有匹配的用户和百分比,表明例如用户A正在对用户B进行10%的投票。这显然是按降序排列的,以便最倾向于专门为另一个用户投票的用户位于最佳位置。
所以,我的问题是,这在单独的查询中是否可行,或SQL可以在多大程度上得到我?
指向现有实现的指针? (最好是PHP)
答案 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()