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

时间:2016-05-02 05:56:51

标签: php mysql apache vendor

在我的软件评级表上我有4个字段。 id autoincrement rvid供应商ID 评级日期 评级实际数字评级

在过去的几个月里,我做了很多,但这次我很难过,而且我无法清楚地了解到最好的方法。我想要做的是找出供应商是否有3个低“连续”评级。如果他们的最后三个评级是< 3然后我想标记它们。

我已经玩了几个小时了,所以我想我会问(不是答案),但是为了一些路径方向只是为了推动我前进,我坚持想到这里的圈子。

我已经尝试了GROUP BY和几个ORDER BY,但这些尝试并不顺利,所以我想知道这不是一个mysql的答案,而是一个php答案。换句话说,也许我只需要采取我迄今为止所拥有的东西,然后通过usort之类的东西转移到php方面并按照这种方式进行操作。

这是我到目前为止我所做的选择身份,一开始认为这是获得最后一次结果的最好方法但是我有一个小小的突破,如果他们已经有3连续的id无关紧要,所以我把它从查询中删除了。

  $sql = "SELECT `rvid`, `rating` FROM `vendor_ratings_archive` WHERE `rating` <= '3' ORDER BY `rvid` DESC";

给我这个

Array
(
[0] => Array
    (
        [rvid] => 7
        [rating] => 2
    )

[1] => Array
    (
        [rvid] => 5
        [rating] => 1
    )

[2] => Array
    (
        [rvid] => 5
        [rating] => 0
    )

[3] => Array
    (
        [rvid] => 5
        [rating] => 3
    )

)

这只是我在田里扔的样品,这里只有4行,就像现在一样,它将是吨行。但基本上这告诉我,这些是表中评级较低的供应商。这就是我被绊倒的地方。我只能在查询中进行一种排序,这就是为什么我认为我需要采取这个并转移到php端完成它。

我认为我需要首先用rvid用php对元素进行排序,然后看看连续三个元素是否是同一个供应商(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
    )

)  

3 个答案:

答案 0 :(得分:2)

这是你可以开始接近这个的一种方式 - 完全在SQL中:

  • 获取供应商的最新评分。 ORDER BY日期DESC,限制1.
  • 获得供应商的倒数第二名。 ORDER BY date DESC,limit 1,OFFSET 1.

然后编写一个执行前两个表的LEFT连接的查询。您将拥有一个包含三列的数据集:

  • 供应商ID
  • 最后评级
  • 倒数第二次

然后你可以写一个表达式,说“如果column1是&lt; 3并且column2&lt; 3,那么这个新列是真的”

您应该能够相对轻松地将其扩展到三列。

答案 1 :(得分:1)

以下是解决这个谜题的方法。我认为在这里解释它有助于和Alex一起帮助,因为他关键时刻使用了约会。我首先开始考虑在查询中使用if statment,实际上这让我的大脑开箱即用,然后它让我知道该怎么做。

它并不完美,当然可以使用一些修剪来减少代码,但我理解它似乎有效,所以这对我来说是平等的。

查询...

 $sql = "SELECT `rvid`, `ratedate`,`rating` FROM `vendor_ratings_archive` WHERE `rating` <= '3' ORDER BY `ratedate`, `rvid`  DESC";

给了我这个

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
    )

 )

注意供应商(rvid)5如何组合在一起,这是一个额外的加号。

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

     foreach($results as $yield)
     {  

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

      }//close foreach

给了我这个

阵    (     [0] =&gt; 7     [1] =&gt;五     [2] =&gt;五     [3] =&gt;五    )

然后我们将数组值计算到组重复

 $rvidcounter = array_count_values($rvidarray);

导致此

Array(
[7] => 1
[5] => 3
)

所以现在供应商7作为1低分,供应商5有3个低分,因为他们已经按日期排序我知道它是连续的。好吧听起来不错lol“)

然后我们用另一个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] => 5
)

这都是在服务功能中完成的。所以最后的交易是这个数组中的每个人都有超过3个连续的低评级然后我只是在我的普通php进程文件中使用返回的数组并通过id获取每个供应商的名称并将其传递给html并打印出列表

完成......

如果您愿意,请随时改进。我可能会也可能不会使用它,因为上面的代码对我来说很有意义。更复杂的东西对我来说可能没有意义6从现在开始大声笑但是看到有人想出来缩短这个过程会很有趣。

非常感谢和Happy Coding !!!!!
戴夫:)

答案 2 :(得分:0)

你可以在SQL中这样做:

comm

您将变量设置为不存在的ID。在每个按时间顺序排序的行中,检查评级是否过低,导致1(太低)或0(ok)。如果rvid不等于最后一个rvid,则意味着新的供应商部分正在开始。在section的开头设置值0或1,否则添加此值。最后存储当前行的rvid以便在下一行进程中进行比较。

上面的代码一直在寻找连续3个低评级(低意味着 <3> 的值)。

小修改会检查所有最新3个评分是否等于或小于3

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
;