我正在尝试为表格中的每一列生成统计信息。表中有多组数据可以使用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
表运行查询并对结果进行循环,但这感觉太手动了。也许这是最好的方式,但我想我应该问,以防我可以学到更好的方法。
答案 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);
?>