2013-12-15 120 views
1

我試圖爲表中的每一列生成統計信息。表中有多組數據,可以使用token字段查詢。我現在想要編譯的統計數據很簡單:最大值,最小值和平均值。爲MySQL表中的每一列生成統計信息

我知道如何用一個非常強大的查詢來做到這一點,但我正在尋找更優雅的東西。這是我到目前爲止有:

SELECT 
    MAX(`A`), 
    MIN(`A`), 
    AVG(`A`) 
FROM `table` 
WHERE ... 

這一工程,但我必須知道所有字段的提前,這使得查詢確實笨拙的。此外,當我真正想要的是每場有max,min和average per field的行時,它會返回一行數據。

Field Max Min Avg 
A  4  1  2 
B  10  8  9 
C  12  1  3 

我知道我需要一個查詢的for循環在字段列表功能等同,但是這超出目前我的MySQL的能力。任何幫助將不勝感激。

我的問題類似於這個:link。其中一條評論基本上要求我提出同樣的建議 - 一種在一個或多個表上運行這種查詢的方式,而不必提前知道域的數量。我意識到我可以運行一個查詢到describe表和循環的結果,但是這感覺過於手動。也許這是最好的方式,但我想我應該問,以防我可以學習更好的方法。

+2

你將不得不使用動態SQL來解決這個問題 - 這本質上是使用'describe',然後遍歷結果。有許多方法可以使這些代碼無需人工干預即可工作,但它仍然是代碼而不是單個查詢。 –

+0

看到正常化 – Strawberry

+0

我不知道你在說什麼草莓。我知道規範化意味着什麼,但不知道它如何適用於此。我不需要以任何方式改變數據。 – Anthony

回答

0

我猜有更好的方法來做到這一點,但我用下面的代碼解決了我的問題。我想我應該把它張貼在這裏以防別人幫助別人。

<?php 
require_once("dbconfig.php"); 
$con = mysql_connect($server,$user,$password); 
mysql_select_db($db); 

$tokens = explode(",", $_GET['tokens']); 
$test = $_GET['test']; 

$sql = "DESCRIBE `{$test}`"; 
$rows = mysql_query($sql); 
$fields = array(); 
while($row = mysql_fetch_row($rows)) { 
    $fields[] = $row[0]; 
} 

header("Content-type: text/xml"); 
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"); 
echo "<rows>"; 

foreach ($fields as $field) { 
    $sql = "SELECT MAX(`{$field}`),MIN(`{$field}`),AVG(`{$field}`) 
      FROM `{$test}` WHERE token = " . implode(" OR token = ", $tokens); 

    $rows = mysql_query($sql); 
    while($row = mysql_fetch_row($rows)) { 
     echo "<row id='{$field}'>"; 
     echo "<cell>{$field}</cell>"; 
     for($i = 0; $i < 3; $i++) { 
      echo "<cell>" . number_format($row[$i],3) . "</cell>"; 
     } 
     echo "</row>"; 
    } 
} 

echo "</rows>"; 
mysql_close($con); 
?>