考虑到上述信息,请考虑下表:
假设匹配结果为:
阿森纳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')
上面的脚本部分正常工作但是当应该返回多个成员时,它会给出错误的结果,并且也只返回一个成员,当没有成员选择正确时我得到错误的结果。
关于如何解决/解决问题的任何想法或帮助?
答案 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
修改:请注意,外部条件下的获胜者同样适用。