混淆Avg()和加入2个表

时间:2013-11-13 10:58:50

标签: php mysql sql highcharts jointable

我已经对平均和加入表格进行了一些研究。

基本上我想使用Highcharts显示不同植物物种的平均高度,从MySQL数据库中提取数据。不幸的是,高度数据和物种名称被设置为添加到不同的表中。

我已经有了它的工作,但是当我下载数据并在Excel中找到平均值时,数字与显示的数据不同 - 所以我显然没有做得对。我已经仔细检查过我在Excel中做得很好,所以几乎可以肯定这是我的MySQL查询填满了。

实际表格中有大量条目,所以我在下面举一个例子。

我目前的查询是:

<?php
$result = mysql_query("
SELECT DISTINCT(plant_records.plant_id), ROUND(AVG(plant_records.height),2) as plant_average, plant_list.id, plant_list.plant_species
FROM plant_records
INNER JOIN plant_list
ON plant_records.plant_id=plant_list.id
GROUP BY plant_list.plant_species
")  or die(mysql_error()); 

while ($row = mysql_fetch_array($result)) {
$xAxisValues[] = "'" . $row['plant_species'] . "'";
$AseriesValues[] = $row['plant_average'];
}
?>

我做得对吗?我找到了一些很好的教程来解释连接,like this one,但我仍然感到困惑。我想知道在我加入他们之前我是在平均还是什么?

记录表中的

“plant_id”对应于“列表”中的“id”

plant_records:

id  plant_id    date_recorded   height
1   3           01/01/2013      0.2523123
2   1           02/01/2013      0.123
3   3           03/02/2013      0.446
4   3           04/03/2013      0.52
5   1           05/03/2013      0.3
6   2           06/03/2013      0.111
7   2           07/05/2013      0.30
8   4           08/05/2013      0.22564
9   1           09/05/2013      1.27
10  3           10/05/2013      1.8

plant_list:

id  registration_date   contact_name    plant_species   plant_parent
1   01/01/2013          Dave            ilex_prinos     London_Holly
2   02/01/2013          Bill            acer_saccharum  Brighton_Maple
3   01/01/2013          Bob             ilex_prinos     London_Holly
4   04/01/2013          Bruno           junip_communis  Park_Juniper

修改 我已经尝试了使用Excel查找数据的所有可能方法(例如,故意不过滤唯一ID,不同的平均类型,选择多个物种等)以查找我的查询正在使用的计算,但我无法得到相同的结果。

2 个答案:

答案 0 :(得分:0)

如果我们假设plant_id不是唯一标识符 - 意味着单个plant_id仅适用于任何给定物种的单个植物,并且您想知道单个物种的平均高度是多少种类是你能做到的:

SELECT PL.plant_species, ROUND(AVG(PR.height),2) as plant_average
FROM plant_records AS PR
JOIN plant_list AS PL
     ON PR.plant_id=PL.id
GROUP BY PL.plant_species

这将返回如下内容:

plant_species   plant_average
acer_saccharum  0.2100000
ilex_prinos     0.6700000
junip_communis  0.2300000

答案 1 :(得分:0)

我发现您的查询目前存在两个问题。

  1. 在拥有plant_list.id的同时选择GROUP BY plant_list.plant_species不会产生任何感兴趣的东西,因为MySQL将从任何匹配的工厂返回任意id种类。

  2. 您声明您只对最近的录音感兴趣,但查询中没有任何内容反映出这一事实。

  3. 鉴于此信息,请尝试此查询:

    SELECT ROUND(AVG(pr.height),2) as plant_average, plant_list.plant_species
    FROM plant_records pr
    INNER JOIN plant_list
    ON pr.plant_id=plant_list.id
    WHERE pr.date_recorded = (
        SELECT MAX(pri.date_recorded) FROM plant_records pri
        WHERE pri.plant_id = pr.plant_id
    )
    GROUP BY plant_list.plant_species
    

    或者,如果您只想要特定日期的平均高度,只需将其直接传递给查询,而不是使用子查询。