mysql根据条件返回零到多个结果和最接近的结果

时间:2015-06-20 13:36:03

标签: mysql sql

  • 网站允许用户选择他们认为会赢得某项运动的人 匹配。
  • 用户选择记录在表“picks”
  • 上传比赛结果后
  • 猜测结果正确的成员且最接近得分获胜
  • 匹配可以无多人获胜

考虑到上述信息,请考虑下表:

enter image description here

假设匹配结果为:

阿森纳3利物浦2

Result = Arsenal By 1

我正在寻找一种方法来返回所有猜到正确结果和得分差异的成员如果 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 个答案:

答案 0 :(得分: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 Fiddle中返回多行的示例。我对示例数据中的scorediff与查询中的score感到有点困惑,因此您可能仍需要使用查询来使其与您的实际数据一起使用。但是这个想法是子查询需要与外部查询相关联才能获得正确的事件和赢家。

答案 1 :(得分: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

修改:请注意,外部条件下的获胜者同样适用。