mysql查询找到最常见的及其相邻的数字

时间:2016-12-29 18:45:34

标签: php mysql

我希望我把这个问题说得对,我已经有很长一段时间了,现在正在寻找不同的方法,我有一个应用程序,用于调查用户他们认为适合商品的价格然后从应用程序出现基于most commonnear common prices的平均价格,平均问题就出现了一个可以找到这些价格的查询,所以我的表格样本:

|id |commodityFk|price |dateCreated        |
--------------------------------------------
|1  |1          |1200  |2016-12-24 22:30:30|
|2  |1          |500000|2016-12-24 22:30:30|
|3  |1          |500000|2016-12-24 22:30:30|
|4  |1          |450000|2016-12-24 22:30:30|
|5  |1          |506980|2016-12-24 23:15:12|
|6  |1          |2000  |2016-12-25 23:57:06|

因此,从此表中most common price500000,但我们的506980450000价格也为near the common price,因此我们希望它为500000, 500000, 450000 and 506980 {1}}我个人并不熟悉MySQL,任何帮助解决这个问题都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

您在寻找完全基于MySQL的解决方案吗?正如评论中所提到的,你应该更明确地定义“近”。在下面的示例中,我调用了平均值“{near”值的1 Std Deviation内的任何值。

此外,如果有超过1个最常见的价格,你会怎么做?在不知道您的要求的细节的情况下,我可能建议采用一种方法,通过将平均值作为起点而不是模式来完全绕过该问题。或者,您可以使用@Override public int compare(Point o1, Point o2) { BigDecimal d1 = getDistance(o1); BigDecimal d2 = getDistance(o2); return d1.compareTo(d2); } 函数尝试获取模式,然后使用平均值(如果失败)。

这是一个基于值聚类输出值的示例,并避免必须处理与模式相关的奇怪边缘情况。

COALESCE()

这显然只是一个起点,但它具有相当的可扩展性。您可以轻松更改SELECT AVG(price) FROM prices JOIN (SELECT AVG(price) as rawAverage, STD(price) as deviation FROM prices) stats WHERE commodityFk = 1 AND price BETWEEN (rawAverage - deviation) AND (rawAverage + deviation); 子句中的表达式,以更改“近”值边界的定义方式。

答案 1 :(得分:1)

您可能会发现从SQL返回完整价格表并创建一个分析价格列表的PHP函数以确定接近普通价格的价格是有帮助的。

这样可以轻松调整标准。

也许这样的事情对你来说是一个开始:

function findPricesNearCommonPrice($data)
{
    $pricesNearCommonPrice = Array();

    // find most common price
    $countOfEachValue = array_count_values($data);
    $mostCommonPrice = array_search(max($countOfEachValue), $countOfEachValue); // doesn't account for items that occur the same number of times, but you could make it do that :-)
    echo "Most Common Price: " . $mostCommonPrice . "<br><br>";

    $tolerance = .15; // 15%

    $minNearPrice = $mostCommonPrice * (1 - $tolerance);
    $maxNearPrice = $mostCommonPrice * (1 + $tolerance);

    foreach ($data as $p) {
        if ($p > $minNearPrice && $p < $maxNearPrice) {
            $pricesNearCommonPrice[] = $p;
        }
    }

    return $pricesNearCommonPrice;
}

然后,如果你这样做:

$data = Array(500000, 500000, 450000, 506980, 2000);

$values = findPricesNearCommonPrice($data);
$average = array_sum($values) / count($values);

echo "Prices near the most common price:<br>";
echo implode(", ",$values);

echo "<br><br>";
echo "Average: " . $average;

你得到:

Most Common Price: 500000

Prices near the most common price:
500000, 500000, 450000, 506980

Average: 489245

当然,您需要对其进行修改,以满足您的确切需求和数据格式,但希望这是一个开始。