为MySQL表中的每一列生成统计信息

时间:2013-12-15 16:22:35

标签: mysql

我正在尝试为表格中的每一列生成统计信息。表中有多组数据可以使用token字段进行查询。我现在要编译的统计信息很简单:max,min和average。

我知道如何通过非常强力的查询来做到这一点,但我正在寻找更优雅的东西。这就是我到目前为止所做的:

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

这有效,但我必须提前知道所有字段,这使查询真的很笨拙。此外,当我真正想要的是每个字段的行,每个字段的最大,最小和平均值时,它返回单行数据。

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

我知道我需要一个查询,它在字段列表中的for循环功能相当,但目前超出了我的MySQL能力。任何帮助将不胜感激。

我的问题与此类似:link。其中一条评论基本上要求我提出同样的建议 - 一种在一个或多个表上运行此类查询而不知道提前字段数的方法。我意识到我可以对describe表运行查询并对结果进行循环,但这感觉太手动了。也许这是最好的方式,但我想我应该问,以防我可以学到更好的方法。

1 个答案:

答案 0 :(得分: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);
?>