php mysql检查供应商是否有3个连续低评级

php mysql检查供应商是否有3个连续低评级,php,mysql,apache,vendor,Php,Mysql,Apache,Vendor,在我的软件评分表中,我有4个字段。 id自动递增 rvid供应商id 差饷日期差饷日期 实际数值评级 在过去的几个月里,我已经做了很多,但是这次我被难住了,我无法在脑海中清楚地知道最好的方法。我想做的是找出供应商是否有3个低“连续”评级。如果他们最近三次的评分都 7 [1] => 5 [2] => 5 [3] => 5 ) 然后我们计算数组值以将DUP分组 $rvidcounter = array_count_values($rvidarray); 这就导致了 Array( [7] =>

在我的软件评分表中,我有4个字段。 id自动递增 rvid供应商id 差饷日期差饷日期 实际数值评级

在过去的几个月里,我已经做了很多,但是这次我被难住了,我无法在脑海中清楚地知道最好的方法。我想做的是找出供应商是否有3个低“连续”评级。如果他们最近三次的评分都<3,那么我想标记他们

我已经玩了几个小时了,所以我想我会问(不是问答案),但为了一些路径方向,只是为了推动我前进,我被困在思考中,在这里转圈

我尝试过GroupBy和OrderBy,但这些尝试都没有成功,所以我想知道这是否不是mysql答案,而是php答案。换句话说,也许我只需要利用到目前为止所拥有的,通过usort之类的方式转到php方面,然后这样做

到目前为止,我也选择了id,起初我认为这是获得最后一个连续字符的最佳方法,但后来我有了一个小小的突破,如果他们有3个连续字符,id就不重要了,所以我从查询中去掉了它

  $sql = "SELECT `rvid`, `rating` FROM `vendor_ratings_archive` WHERE `rating` <= '3' ORDER BY `rvid` DESC";
这只是我扔在地里的样本,这里只有4行,而在现实生活中,这将是成吨的行。但这基本上告诉我,这些供应商在表中的评分很低。这就是我被难倒的地方。我只能在查询中进行一种排序,因此我认为我需要将其转移到php端来完成它

我想我首先需要用php按rvid对元素进行排序,然后看看一行中的三个元素是否是同一个vender(rvid)

希望这是有道理的。我的大脑很痛,哈哈

更新-以下是使用*

Array
(
[0] => Array
    (
        [id] => 7
        [rvid] => 7
        [ratedate] => 2016-05-01
        [rating] => 2
    )

[1] => Array
    (
        [id] => 8
        [rvid] => 5
        [ratedate] => 2016-05-01
        [rating] => 1
    )

[2] => Array
    (
        [id] => 6
        [rvid] => 5
        [ratedate] => 2016-05-01
        [rating] => 0
    )

[3] => Array
    (
        [id] => 5
        [rvid] => 5
        [ratedate] => 2016-05-01
        [rating] => 3
    )

)  

这里有一种方法可以开始实现这一点—完全使用SQL:

  • 获取供应商的最后评级。按日期说明订购,限额1
  • 获取供应商的倒数第二个评级。按日期说明订购,限额1,偏移量1
然后编写一个查询,对前两个表进行左联接。您将拥有一个包含三列的数据集:

  • 供应商id
  • 最后评级
  • 倒数第二名

然后你可以写一个表达式“如果第1栏是,下面是a解决这个谜题的方法。我认为在这里解释它很有帮助,就像Alex在使用日期时给我的大脑打了钥匙一样。我首先开始考虑在查询中使用if语句,实际上这让我的大脑从盒子里跳了出来,然后我突然想到该怎么做

它不是完美的,当然可以使用一些修剪来减少代码,但是我理解它,并且它似乎起作用,所以在这门课上,我是可以接受的。 查询

 $sql = "SELECT `rvid`, `ratedate`,`rating` FROM `vendor_ratings_archive` WHERE `rating` <= '3' ORDER BY `ratedate`, `rvid`  DESC";
注意供应商(rvid)5是如何组合在一起的,这是一个额外的优点。

接下来是一个简单的foreach来加载一个新数组

     foreach($results as $yield)
     {  

      $rvidarray[] = $yield['rvid'];          

      }//close foreach
这给了我这个

Array
(
[0] => Array
    (
        [rvid] => 7
        [ratedate] => 2016-05-01
        [rating] => 2
    )

[1] => Array
    (
        [rvid] => 5
        [ratedate] => 2016-05-01
        [rating] => 1
    )

[2] => Array
    (
        [rvid] => 5
        [ratedate] => 2016-05-01
        [rating] => 0
    )

[3] => Array
    (
        [rvid] => 5
        [ratedate] => 2016-05-01
        [rating] => 3
    )

 )
Array
(
[0] => 5
)
排列 ( [0] => 7 [1] => 5 [2] => 5 [3] => 5 )

然后我们计算数组值以将DUP分组

 $rvidcounter = array_count_values($rvidarray);
这就导致了

Array(
[7] => 1
[5] => 3
)
所以现在供应商7是1个低分,供应商5是3个低分,因为他们已经按日期排序了,我知道这是连续的。不管怎么说,这听起来不错(哈哈)

然后我们用另一个foreach创建最终数组

     foreach($rvidcounter as $key => $value)
     {    
        //anything 3 or over is your watchlist

        if($value > 2)
        {
          $watchlist[] = $key; //rvid number stored
         }      

         }//close foreach
这给了我这个

Array
(
[0] => Array
    (
        [rvid] => 7
        [ratedate] => 2016-05-01
        [rating] => 2
    )

[1] => Array
    (
        [rvid] => 5
        [ratedate] => 2016-05-01
        [rating] => 1
    )

[2] => Array
    (
        [rvid] => 5
        [ratedate] => 2016-05-01
        [rating] => 0
    )

[3] => Array
    (
        [rvid] => 5
        [ratedate] => 2016-05-01
        [rating] => 3
    )

 )
Array
(
[0] => 5
)
这一切都是在一个服务函数中完成的。所以最后的交易是,这个数组中的每个人都有超过3个连续的低评分,然后我只需在我的正常php进程文件中使用返回的数组,通过id获取每个供应商的名称,并将其传递到html并打印出列表

完成

如果你愿意,请随时改进。我可能会也可能不会使用它,因为上面的代码对我来说是有意义的。从现在起6个月后,更复杂的东西可能对我来说是没有意义的lol,但看看有人想出了什么办法来缩短这一过程会很有趣

非常感谢您,祝您编码愉快!!!!!

Dave:)

您可以在SQL中这样做:

SET @rvid = -1;

SELECT DISTINCT rvid FROM
(
  SELECT
    rvid,

    @neg := rating<3,  /* 0 or 1 for addition in next line */
    @count := IF(@rvid <> rvid , @neg, @count+@neg) AS `count`, /* set or add */
    @rvid := rvid      /* remember last row */
  FROM
    testdb.venrate

  ORDER BY
    rvid, datetime desc

) subq

WHERE   count>=3
;
SET@rvid=-1;
从中选择不同的rvid
(
挑选
rvid,
@负:=额定值=3
;
将变量设置为不存在的id。在每个按时间顺序排序的行中,检查评级是否过低,结果是1(过低)或0(正常)。如果rvid不等于最后一个rvid,则表示新的供应商部分开始。在部分开始时,设置值0或1,否则添加此值。最后存储当前行的rvid,以便在下一行处理中进行比较

上面的代码一直在寻找3个连续的低评级(低表示值小于3)

一个小的修改检查最近的3个评级是否都小于等于3:

SET @rvid = -1;

SELECT DISTINCT
  rvid
FROM
(
  SELECT
    rvid,

    @high_found := rating>3 OR (@rvid = rvid AND @high_found) unflag,
    @count := IF(@rvid <> rvid , 1, @count+1) AS `count`,
    @rvid := rvid      /* remember last row */

  FROM
    testdb.venrate

  ORDER BY
    rvid, datetime desc

) subq

WHERE count=3 AND NOT unflag
;
SET@rvid=-1;
选择不同的
rvid
从…起
(
挑选
rvid,
@发现高值:=额定值>3或(@rvid=rvid和@high_-found)取消延迟,
@count:=如果(@rvid-rvid,1,@count+1)为'count`,
@rvid:=rvid/*记住最后一行*/
从…起
testdb.venrate
订购人
rvid,日期时间描述
)subq
其中count=3且未取消滞后
;

谢谢Alex,我觉得我好像被编码器挡住了,我只是坐在这里,在雾霭中盯着屏幕,哈哈……这确实有帮助,谢谢……)从你的办公桌上起来,至少10分钟内不要看显示器。喝杯咖啡,舒展一下筋骨,不要做任何与代码相关的事情。然后就会变得清晰起来。事实上,我去了户外,我得到了答案lol-这是真的omg:)哇!那里令人印象深刻的代码Q…远远超过我的大脑,但非常酷,非常简单lol:)我添加了一个short解释。在进一步测试之后,它似乎给他们贴上了3个或3个以上的坏评级,但不是连续的。我测试的评级为1 1 6 4 3,不是连续的3或低于3,并且