4

我有以下内容query,我试图在某个呼吸空间内检索输入的变量的匹配项。

SELECT fthg, ftag, avover, avunder, whh, wha, whd 
FROM full 
WHERE (whh < ($home_odds + 0.05) 
    AND whh > ($home_odds - 0.05) 
    AND wha < ($away_odds + 0.05) 
    AND wha > ($away_odds -0.05) 
    AND whd < ($draw_odds + 0.05) 
    AND whd > ($draw_odds - 0.05))

有时这会返回 0 结果,因此在这种情况下,我想检索与所有三个最接近的匹配记录,但我不太确定如何将查询放在一起。

基本上,如果另一个查询不返回结果,这是最后的手段,无论离原始值多远,这个查询都会返回下一个最好的结果。

谢谢您的帮助

4

2 回答 2

2

您的原始查询会更简单,更具可读性,因为:

SELECT
    fthg,
    ftag,
    avover,
    avunder,
    whh,
    wha,
    whd
FROM full
WHERE ABS($home_odds - whh) < 0.05
    and ABS($away_odds - wha) < 0.05
    and ABS($draw_odds - whd) < 0.05

如果该查询没有返回任何内容,您可以运行这个:

SELECT
    fthg,
    ftag,
    avover,
    avunder,
    whh,
    wha,
    whd
FROM full
ORDER BY
    ABS($home_odds - whh) + ABS($away_odds - wha) + ABS($draw_odds - whd)
LIMIT 1

它将返回与这三对字段的组合偏差最小的行。

于 2013-08-05T14:45:51.810 回答
1

如何伪造您提供的参数和您要比较的参数之间的距离计算?就像是

SELECT fthg, ftag, avover, avunder, whh, wha, whd 
FROM full 
ORDER BY 
        sqrt(abs(whh - $home_odds) * abs(whh - $home_odds)) +
        sqrt(abs(wha - $away_odds) * abs(wha - $away_odds)) +
        sqrt(abs(whd - $draw_odds) * abs(whd - $draw_odds))

这样,即使在您感兴趣的范围内没有匹配项,您仍然可以获得更接近的结果。

于 2013-08-05T14:45:45.730 回答