Php 在事务文件中查找在100个事务中按顺序出现5个以上序列号的事件

Php 在事务文件中查找在100个事务中按顺序出现5个以上序列号的事件,php,sql,mysql,transactions,design-patterns,Php,Sql,Mysql,Transactions,Design Patterns,在一次网上抽奖活动中,我遇到了一个不同寻常的客户请求,我正试图通过将尽可能多的任务推送到SQL中来尽可能高效地构建这个请求 因此,结构是: table: codes raffle_code | ticket_type | sequence A00000001 Red 1 A00000002 Red 2 ... A0000000X Red X B00000001 Blue 1

在一次网上抽奖活动中,我遇到了一个不同寻常的客户请求,我正试图通过将尽可能多的任务推送到SQL中来尽可能高效地构建这个请求

因此,结构是:

table: codes raffle_code | ticket_type | sequence A00000001 Red 1 A00000002 Red 2 ... A0000000X Red X B00000001 Blue 1 etc 表:代码 抽奖|代码|彩票|类型|序列 A00000001红色1 A00000002红色2 ... A0000000X红色X B00000001蓝色1 等 可以有X个票证类型,每个类型都有自己的序列。抽奖代码是唯一的散列,我刚刚简化了示例

现在的问题是,这些代码是随机发布的,任何按顺序输入的事件(可能)都是欺诈性的。代码输入记录在交易文件中,如下所示:

table: transactions user_id | raffle_code | transaction_number | timestamp 1 A00000032 1 etc... 表:交易 用户| id |抽奖|代码|交易|编号|时间戳 1 A00000032 1等。。。 理想的规则是,如果给定类型的5个以上的抽奖代码在给定的100笔交易中按顺序输入,则会产生怀疑,并应提取相关用户

我最初的想法是尝试先检测欺诈事件,然后分别收集每个欺诈事件的欺诈用户交易。我想到的粗略SQL是这样的:

SELECT c.raffle_code, MIN(t.timestamp), MAX(t.timestamp), MIN(t.transaction_number), MAX(t.transaction_number) FROM codes c, transactions t WHERE c.raffle_code = t.raffle_code GROUP BY c.raffle_code HAVING ( MAX(c.sequence) - MIN(c.sequence) ) = ( COUNT(*) -1 ) AND ( MAX(t.transaction_number) - MIN(t.transaction_number) ) 4; 选择c.抽奖代码、最小值(t.时间戳)、最大值(t.时间戳)、最小值(t.交易编号)、最大值(t.交易编号) 来自代码c,事务处理t 其中,c.raffle\u code=t.raffle\u code 按c.raffle_代码分组 具有(最大(c.序列)-最小(c.序列))=(计数(*)-1) 和(最大(t交易编号)-最小(t交易编号))4; (感谢Bell over in激发了这一想法)

这将在事务文件(事务号范围和时间戳范围)中提供一个位置来重新查询用户ID。这将需要对宣布欺诈的可疑事件进行核查,但这是目前公认的系统警告

上述SQL的问题是,如果在给定的100个事务中出现序列为“3,4,5,6,7,48”的“红色”票证,则不会检测到,因为范围为45,远远大于计数6,因此,如果票证是随机输入的,则这是一种预期情况

事务文件注定会非常大,并且经常被点击,因此使用服务器代码一次挖掘100个事务并构建事务堆栈进行分析将非常低效


以前有人遇到过这样的事情吗?客户对他们的要求仍然很模糊,除了非常简短的文本摘要之外,因此我还提供了检测顺序输入的替代概念。

我从你的问题中得到的印象是你说的是集合“3,4,5,6,7,48”不算欺诈,因为它不符合指定的标准,但您觉得它应该算,因为它觉得有点可疑

检测一个可能的欺诈交易集的问题当然很棘手——我们很容易感觉到一个交易集是欺诈的,而不能够为计算机定义明确的规则

为什么不简单地降低被视为欺诈的序列集的长度

你的直觉可能是这会带来太多的误报。忽略它,除非你有数据来备份它

考虑这一点:

  • 非作弊用户输入两个连续抽奖码的概率是多少?把这个叫做概率X
  • 作弊用户输入两个连续抽奖码的概率是多少?把这个叫做概率Y
如果X>>Y,则两个或多个连续抽奖码的任何一组都有很高的欺诈概率

尝试通过将欺诈交易集定义为包含来自同一用户的两个或多个连续抽奖代码(在100个交易集内)开始。看看这实际发生的频率

如果发现误报过多,请将最小序列长度增加到3。根据需要重复

我觉得您在识别不存在的潜在欺诈交易时过于谨慎。不要想得太多


这更多的是与概率有关,而不是与精度有关,所以你永远不会100%正确,也不会从一开始就接近100%正确。对实际发生的情况进行一些培训、测试和检查是更好的方法。

我从你的问题中得到的印象是,你说的集合“3,4,5,6,7,48”不算作欺诈,因为它不符合规定的标准,但你觉得它应该算作有点可疑

检测一个可能的欺诈交易集的问题当然很棘手——我们很容易感觉到一个交易集是欺诈的,而不能够为计算机定义明确的规则

为什么不简单地降低被视为欺诈的序列集的长度

你的直觉可能是这会带来太多的误报。忽略它,除非你有数据来备份它

考虑这一点:

  • 非作弊用户输入两个连续抽奖码的概率是多少?把这个叫做概率X
  • 作弊用户输入两个连续抽奖码的概率是多少?把这个叫做概率Y
如果X>>Y,则两个或多个连续抽奖码的任何一组都有很高的欺诈概率

尝试通过将欺诈交易集定义为包含来自同一用户的两个或多个连续抽奖代码(在100个交易集内)开始。看看这实际发生的频率

如果发现误报过多,请将最小序列长度增加到3。根据需要重复

<