php mysql检查供应商是否有3个连续低评级
在我的软件评分表中,我有4个字段。 id自动递增 rvid供应商id 差饷日期差饷日期 实际数值评级 在过去的几个月里,我已经做了很多,但是这次我被难住了,我无法在脑海中清楚地知道最好的方法。我想做的是找出供应商是否有3个低“连续”评级。如果他们最近三次的评分都<3,那么我想标记他们 我已经玩了几个小时了,所以我想我会问(不是问答案),但为了一些路径方向,只是为了推动我前进,我被困在思考中,在这里转圈 我尝试过GroupBy和OrderBy,但这些尝试都没有成功,所以我想知道这是否不是mysql答案,而是php答案。换句话说,也许我只需要利用到目前为止所拥有的,通过usort之类的方式转到php方面,然后这样做 到目前为止,我也选择了id,起初我认为这是获得最后一个连续字符的最佳方法,但后来我有了一个小小的突破,如果他们有3个连续字符,id就不重要了,所以我从查询中去掉了它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] =>
$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,并且