我的网站允许用户猜测体育比赛的结果.在比赛结束时,应将猜测与实际结果进行比较.获胜者是具有最接近正确猜测的成员

我正在寻找一种方法来返回所有猜测正确结果和得分差异的成员如果没有(零)成员猜对正确返回猜测最接近正确结果的成员

See MYSQL FIDLE EXAMPLE

我修改了脚本以更改固定值,如下所示

if(isset($_POST['resultBtn'])){
    foreach($_POST['winner'] as $id =>$winner){
        $winscore = $_POST['score'][$id];
        :
        :


$sql="SELECT p.*
        FROM Multiple_Picks p
        WHERE p.event_id='$matchId' AND 
        p.pick='$winner' AND
        abs(p.score-'$winscore') = (SELECT min(abs(p2.score-1))
                        FROM Multiple_Picks p2
                        Where p2.pick=p.pick AND
                        p2.event_id = p.event_id)";

我的问题是如果我在下表中运行此脚本:

即使我将结果完全正确,nothing也会显示:

我的变量值在sql语句中是正确的,所以这不是问题

任何帮助将受到欢迎……

重要的是,选择最严格的结果的用户,对于所有游戏,在圆圈期间是赢家

例如:如果用户A赢得了4个选择而用户B赢得了5个选择,那么用户B就是该轮的赢家

在这个答案中,我称之为“最佳”选择任何为特定比赛选择了正确赢家的选秀权,并且与实际比赛得分的得分最接近.

这些脚本也尊重竞争中的不同“轮次”,因为这是一个重要的复杂因素.

这个答案分为两部分:首先是一个类似于问题中的查询,该查询返回特定匹配的所有“最佳”选择.为了更容易在sql fiddle中运行,我使用了MysqL变量而不是PHP变量.

带有测试数据的模式:

create table Multiple_Picks (
  pick_id int,member_nr int,event_id int,pick varchar(100),score int
  );

insert into Multiple_Picks 
values
(11,100,1,'Crusaders',15),(12,2,'Waratahs',10),(13,3,'Chiefs',4),(21,200,(22,(23,'Lions',(31,300,(32,12),(33,6),(41,4,20),(42,5,(43,6,20)
;

查询显示所有选择,然后显示特定匹配的最佳选择:

set @matchId = 2;
set @winner = 'Waratahs';
set @winscore = 8;

-- Show all picks for a particular match
select * from Multiple_Picks
where event_id = @matchId;

-- Show best picks for a particular match
select p.*
from Multiple_Picks p
where p.event_id = @matchId
and p.pick = @winner
and abs(p.score - @winscore) = 
  (select min(abs(other.score - @winscore)) 
   from Multiple_Picks other
   where other.event_id = @matchId
   and other.pick = @winner
  )
;

SQL Fiddle to show picks for particular match

-- Show all picks for a particular match
+---------+-----------+----------+----------+-------+
| pick_id | member_nr | event_id |   pick   | score |
+---------+-----------+----------+----------+-------+
|      12 |       100 |        2 | Waratahs |    10 |
|      22 |       200 |        2 | Waratahs |    10 |
|      32 |       300 |        2 | Waratahs |    12 |
+---------+-----------+----------+----------+-------+

-- Show best picks for a particular match
+---------+-----------+----------+----------+-------+
| pick_id | member_nr | event_id |   pick   | score |
+---------+-----------+----------+----------+-------+
|      12 |       100 |        2 | Waratahs |    10 |
|      22 |       200 |        2 | Waratahs |    10 |
+---------+-----------+----------+----------+-------+

现在我们需要努力寻找每一轮比赛的胜利者.

首先,我们有额外的测试数据,其中包含第1轮和第2轮中匹配的实际分数.

create table Matches (
  event_id int,winner varchar(100),score int,round int
  );

insert into Matches 
values
(1,10,1),(2,11,(3,(4,20,2),(5,(6,2)
;

现在选择所有匹配的最佳选择.子选择(别名为m)计算每次匹配的best_diff,作为实际得分与每个猜测得分之间的最小差异.然后将此子选择连接到每个选择,以便仅返回“最佳”选择.

-- Show all best picks for all Matches
select p.*,m.round
from Multiple_Picks p
join (
  select m2.event_id,m2.winner,m2.score,m2.round,min(abs(m2.score-p2.score)) as best_diff
  from Matches m2
  join Multiple_Picks p2
  on p2.event_id = m2.event_id and p2.pick = m2.winner
  group by m2.event_id,m2.round
) as m
on p.event_id = m.event_id and p.pick = m.winner 
   and abs(m.score - p.score) = m.best_diff
order by m.round,p.event_id
;

通过使用member_nr和round对上一个查询进行分组,可以轻松获得每轮每个玩家的最佳选择数:

-- Show a count of best picks for each player for each round
select p.member_nr,m.round,count(*) as best_count
from Multiple_Picks p
join (
  select m2.event_id,m2.round
) as m
on p.event_id = m.event_id and p.pick = m.winner 
   and abs(m.score - p.score) = m.best_diff
group by p.member_nr,m.round
order by m.round,count(*) desc
;

SQL Fiddle for all best picks and counts for all matches

-- Show all best picks for all Matches
+---------+-----------+----------+-----------+-------+-------+
| pick_id | member_nr | event_id |   pick    | score | round |
+---------+-----------+----------+-----------+-------+-------+
|      31 |       300 |        1 | Crusaders |    15 |     1 |
|      21 |       200 |        1 | Crusaders |    15 |     1 |
|      11 |       100 |        1 | Crusaders |    15 |     1 |
|      12 |       100 |        2 | Waratahs  |    10 |     1 |
|      32 |       300 |        2 | Waratahs  |    12 |     1 |
|      22 |       200 |        2 | Waratahs  |    10 |     1 |
|      23 |       200 |        3 | Lions     |     4 |     1 |
|      41 |       100 |        4 | Crusaders |    20 |     2 |
|      42 |       100 |        5 | Waratahs  |    20 |     2 |
+---------+-----------+----------+-----------+-------+-------+

-- Show a count of best picks for each player for each round
+-----------+-------+------------+
| member_nr | round | best_count |
+-----------+-------+------------+
|       200 |     1 |          3 |
|       300 |     1 |          2 |
|       100 |     1 |          2 |
|       100 |     2 |          2 |
+-----------+-------+------------+

最后阶段是仅选择那些拥有最多最佳选秀权的每轮选手.我尝试修改上面的查询,但嵌套变得令人困惑,所以我的解决方案是创建一些逻辑视图,以便更容易理解最终查询.视图基本上封装了我上面解释的查询的逻辑:

create view MatchesWithBestDiff as
select m.event_id,m.winner,m.score,min(abs(m.score-p.score)) as best_diff
from Matches m 
join Multiple_Picks p
on p.event_id = m.event_id and p.pick = m.winner
group by m.event_id,m.round
;

create view BestPicks as
select p.*,m.round
from Multiple_Picks p
join MatchesWithBestDiff m
on p.event_id = m.event_id and p.pick = m.winner 
   and abs(m.score - p.score) = m.best_diff
;

create view BestPickCount as
select member_nr,round,count(*) as best_count
from BestPicks
group by member_nr,round
;

因此,显示每轮获胜者的查询只是:

-- Show the players with the highest number of Best Picks for each round
select *
from BestPickCount p
where best_count = 
(
    select max(other.best_count)
    from BestPickCount other
    where other.round = p.round
)
order by round
;

SQL Fiddle for players with most Best picks for each round

-- Show the players with the highest number of Best Picks for each round
+-----------+-------+------------+
| member_nr | round | best_count |
+-----------+-------+------------+
|       200 |     1 |          3 |
|       100 |     2 |          2 |
+-----------+-------+------------+

整个调查让我想起让sql做多次操作是多么棘手,需要根据最大值和总和来选择记录.使用窗口函数(OVER和PARTITION BY子句)可以更容易地进行某些类型的查询,但它们在MysqL中不可用.

在设计上述查询时,我发现了一些有趣的限制:MysqL不允许在视图定义中加入子查询.ANSI sql不允许子查询中的聚合引用内部查询中的列和外部查询中的列. MysqL似乎有时允许这样做,但我无法找到关于何时允许的明确指导,因此我选择编写上述查询来避免这种“功能”.

php – mysql – 获取最接近正确值的值,根据结果返回0到很多的更多相关文章

  1. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  2. Swift 运算属性

    都是直接定义,赋值使用Swift中的运算属性并不是直接用来存储值的,而是类似于函数的作用。他里面封装了getter和setter方法。比如我们举一个例子,正方形类,我们只要有边长的属性,那么周长是不是直接边长*4即可,同理只要知道周长,周长/4也能得到边长。创建一个正方形类属性round就是一个运算属性我们可以试一下有问题可以继续学习苹果开发群:414319235欢迎加入欢迎讨论问题

  3. swift3 – Xcode 8 Beta 4 Swift 3 – “圆”行为发生变化

    我有以下简单的扩展为Double,它在所有的Xcode8beta3的工作正常从Beta4开始,我得到“不能使用变异成员的不变价值:”自我“是不可变的”在回合的功能–有人有任何线索吗?

  4. Android – 将SQLite与MySQL同步的最佳方式

    参见英文答案>Synchronizingclient-serverdatabases5个我正在开发一个包含网络应用和移动应用程序的项目,该应用程序记录每日用户的数据.用户可以删除,更新他们的数据,他们可以使用许多设备插入数据.我打算这样开发:用户输入他们的数据然后插入sqlite.服务将定期启动(每5小时或每小时)以使用时间戳与MysqL同步.我确实在互联网上使用服务和时间戳搜索了一个样本,但我一

  5. android – 如何将唯一的GCM注册标识存储到MySQL中

    我正在设置GoogleCloudMessaging机制的服务器端,使用MySQL存储移动应用提供的注册ID.Google可以发出最多4k个注册码,我被迫将其存储在TEXT字段中.所有的好,到目前为止,问题是我必须处理这样的情况:>用户登录到应用程序>该应用从google请求注册ID>应用程序将新的注册ID发送到应用服务器>服务器存储该注册ID并将其链接到当前登录的用户>该用户注销并且新用户登录>应

  6. nodeJs链接Mysql做增删改查的简单操作

    本篇文章主要介绍了nodeJs链接Mysql做增删改查的简单操作,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. PHP连接MYSQL数据库的3种常用方法

    这篇文章主要介绍了PHP连接MYSQL数据库的3种常用方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例

    这篇文章主要介绍了PHP使用PDO创建MySQL数据库、表及插入多条数据操作,结合实例形式总结分析了php基于pdo的mysql数据库创建、数据表创建以及多条数据插入操作相关实现技巧,需要的朋友可以参考下

  9. MybatisPlus如何处理Mysql的json类型

    这篇文章主要介绍了MybatisPlus如何处理Mysql的json类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  10. 基于PHP+mysql实现新闻发布系统的开发

    这篇文章主要介绍了基于PHP+mysql实现新闻发布系统的开发,文章通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部