2015-06-20 61 views
0
  • 一个网站允许用户挑选他们认为会赢得某个运动的人,他们会赢得某个运动 的比赛。
  • 用户选取记录在表“挑选”比赛结果上传
  • 谁猜到了正确的结果 且最接近的比分
  • 成员赢得
  • 一场比赛可以有没有很多获奖者

考虑到上述信息考虑下表:mysql根据条件返回零到许多结果和最接近的结果

enter image description here

假设比赛结果是:

阿森纳3利物浦2

Result = Arsenal By 1 

林现在正在寻找一种方式来回报谁猜中正确结果所有成员和得分差异IF NO (零)成员猜对正确返回成员谁猜对了最接近到正确的结果

在上面的例子:

约翰,史蒂芬应退还谁由2

考虑到上述与阿森纳猜测最接近我创建了下面的脚本:

select * from picks where event_id = '$eventId[$key]' and 
    abs(score-$winScore) = (select min(abs(score-$winScore)) from picks 
    where pick = '$winner') 

上面的脚本是部分但是当多于一个成员应该返回时,它会给出错误的结果,并且只返回一个成员,当没有成员选择正确的时候也会得到错误的结果。

任何想法或帮助我如何解决/解决我的问题?

回答

2

一种可能性是在实际运行的查询中有limit 1。或者,您只是从结果集中获取第一行。

但是,查询也需要修复。你需要子查询中的事件ID。这并不明显,因为您的示例数据不包含此列。此外,获奖者需要在子查询和外查询同时匹配:

select p.* 
from picks p 
where p.event_id = '$eventId[$key]' and 
     p.pick = '$winner' and 
     abs(p.score-$winScore) = (select min(abs(p2.score-$winScore)) 
           from picks p2 
           where p2.pick = p.pick and 
             p2.event_id = p.event_id 
           ); 

Here是在它的SQL小提琴返回多行的例子。我对示例数据中的scorediff和查询中的score有点困惑,所以您可能仍然需要使用查询来使其与实际数据一起工作。但是这个想法是,子查询需要与外部查询相关联才能获得正确的事件和赢家。

+0

不,内部查询缺少'event_id'的条件。 – jeroen

+0

@ jeroen。 。 。我最初错过了一个条件,因为样本数据缺少'event_id'。它也错过了赢家。我在修正它,因为你写你的评论 –

+0

@GordonLinoff和Jeroen非常感谢你的男士我会去给它并立即给你反馈 –

2

您的查询时出现错误:在内部查询你没有选择正确的event_id所以你会在所有的事件搜索,给你错误的结果:

select * from picks where event_id = '$eventId[$key]' and 
    abs(score-$winScore) = (select min(abs(score-$winScore)) from picks 
    where pick = '$winner' AND event_id = '$eventId[$key]') 
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ here 

编辑:注这同样适用于外部条件下的赢家。