2016-12-29 52 views
0

我希望我的措辭正確的問題,我已經在這個相當長的時間現在尋找不同的方法,我有一個應用程序,民意調查用戶的價格,他們認爲是正確的商品然後從那裏應用程序是要拿出基礎上,most common平均價格near common prices和它們平均問題想出一個查詢,可以找到那些價格,所以我的表的樣本:mysql查詢找到最常見的和他們的鄰居

|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我個人不熟悉任何幫助解決這個問題將不勝感激。

+0

你有什麼可以接受的'near'值嗎? – SAVAFA

+0

我的目標是找到所有數字的基數,計算哪個基數最多,平均所有基數,但任何範圍都很大 –

+1

如果有超過1個「最常見的價格」,該怎麼辦?如果每個價格只發生一次,會怎樣? – GentlemanMax

回答

2

您是否在尋找完全基於MySQL的解決方案?正如評論中提到的,你應該更明確地定義「近」。在下面的例子中,我調用了平均「近」值的1 Std Deviation之內的任何值。

此外,如果有超過1個最常見的價格,你會怎麼做?在不瞭解您的要求的具體情況的情況下,我可能會建議採取一種完全繞過該問題的方法,即將平均值作爲起點而不是模式。或者,您可以使用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); 

這顯然只是一個起點,但它具有相當的可擴展性。您可以輕鬆地更改JOIN子句中的表達式,以更改「近」值的邊界定義方式。

+0

哇,你只是做了我在一個星期內沒有做過的事情,在單行查詢中,謝謝。 –

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 

當然你需要修改它以適合您的確切需求和數據格式,但希望這是一個開始。

+0

我喜歡這個,它真的很好,謝謝 –