0

私は、テーブルの平均化と結合について少し悩んでいます。

基本的に、MySQL データベースからデータを取得して、Highcharts を使用してさまざまな植物種の平均高さを表示したいと考えています。残念ながら、身長データと種名は別のテーブルに追加されるように設定されていました。

私はそれを機能させましたが、データをダウンロードして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'];
}
?>

私はそれを正しくやっていますか?このような結合を説明するいくつかの素晴らしいチュートリアルを見つけましたが、まだ混乱しています。私は彼らに参加する前に平均しているのか、それとも何か??

Records テーブルの「plant_id」は、List テーブルの「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

植物リスト:

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 をフィルタリングしない、異なる平均タイプを選択する、複数の種を選択するなど)、クエリで使用している計算を見つけましたが、同じ結果が得られませんでした。結果。

4

2 に答える 2

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
于 2013-11-13T13:08:10.260 に答える
0

現在、あなたのクエリに 2 つの問題があることに気付きました。

  1. MySQL はそれぞれの種に一致する植物のいずれかから任意のを返すため、 を持っているときに選択plant_list.idしてGROUP BY plant_list.plant_speciesも、興味深いものは何も得られません。id

  2. あなたは最新の録音だけに関心があると述べていますが、クエリにはその事実が反映されていません。

その情報を考慮して、次のクエリを試してください。

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

または、特定の日付の平均身長だけが必要な場合は、サブクエリを使用する代わりに、それをクエリに直接渡します。

于 2013-11-13T13:14:43.353 に答える