0

サーバー側のスクリプトを実行するために、PHP で MYSQL を使用しています。レビューの対象者に関する情報と結合する必要があるレビュー データを集計するクエリを作成しようとして問題が発生しています。

私は2つのテーブルを持っています。1 つは学校に関する一般的な情報を含む「学校」と呼ばれるもので、もう 1 つはユーザーが提供したレビュー情報を含む「レビュー」と呼ばれるものです。

学校のテーブルは次のように構成されています。

id、schoolName、schoolCity、schoolCountry (フィールド名用)

例では、データを次のように返します。

1、ASD、ドバイ、アラブ首長国連邦
2、DAA、ドバイ、アラブ首長国連邦

「レビュー」テーブルには 57 列あります。

RID、schoolID、profileID、dateCreated、Q1、Q2、Q3、...Q51、Q52、freeReview (フィールド名として)

次のようなデータが返されます。

1, 8, 55, 2012-10-10 05:16:05, 10, 8, 9, 2, 3....

Q1 から Q25 までは、レビュー フォーム内の質問で、0 ~ 10 の整数として返されます。他の列は、(上記のように) profile テーブルと school テーブルに関連付けられています。

特定の学校のすべてのレビューを合計し、その学校に送信されたレビューの数に基づいて学校の平均スコアを生成する、個々の学校のクエリを作成できます。

私が問題を抱えているのは、すべての (ページネーションによって分割された) 学校をその平均スコアと合計スコアを含む表にリストするページを作成したいということです。

これは、学校の全体的な平均点を生成するクエリです。

$singlereviewtotal = mysql_query("
SELECT ROUND(
((SUM(Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10+Q11+Q12+Q13+Q14+Q15+
Q16+Q17+Q18+Q19+Q20+Q21+Q22+Q23+Q24+Q25+Q26+Q27+Q28+Q29+Q30+
Q31+Q32+Q33+Q34+Q35+Q36+Q37+Q38+Q39+Q40+Q41+Q42+Q43+Q44+Q45+
Q46+Q47+Q48+Q49+Q50+Q51+Q52)/((52*10)*
(SELECT COUNT(*) FROM reviews WHERE schoolID='$schoolvalue')))*10), 2)
AS total
FROM reviews
WHERE schoolID='$schoolvalue'") or die(mysql_error()); 

これにより、すべての列と行の正しい合計値と平均値が生成され、小数点以下 2 桁に丸められます。WHERE 句は、使用する学校 ID をクエリに伝えるページの PHP 値から取得されます。

これは、すべての学校をリストに入れようとする試みです。

$sumreviews = mysql_query("SELECT *, 
 ROUND(
 ((Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10+Q11+Q12+Q13+Q14+Q15+
 Q16+Q17+Q18+Q19+Q20+Q21+Q22+Q23+Q24+Q25+Q26+Q27+Q28+Q29+Q30+
 Q31+Q32+Q33+Q34+Q35+Q36+Q37+Q38+Q39+Q40+Q41+Q42+Q43+Q44+Q45+
 Q46+Q47+Q48+Q49+Q50+Q51+Q52)/(52*10)
 *10),2) AS atotal 
 FROM reviews
 RIGHT JOIN schools ON schools.SID = reviews.schoolID
 GROUP BY schools.schoolName, reviews.schoolID
 ORDER BY atotal DESC")or die(mysql_error()); 

このクエリでは学校のリストが表示されますが、"atotal" の出力では、その学校の最初の行の合計のみが返されます (この場合は 7.31 で、出力のすぐ下に表示されますが、平均はスコアは 7.23 である必要があります)。

上記のクエリで GROUP BY を削除すると、すべての学校のリストに加えて、より多くのレビューがある一部の学校 (アメリカン スクール オブ ドバイなど) の追加の行が取得されます。

学校名、都市、国、評価
アメリカン スクール オブ ドバイ、ドバイ、アラブ首長国連邦 7.31
ドバイ アメリカン アカデミー、ドバイ、アラブ首長国連邦 7.19
アメリカン スクール オブ ドバイ、ドバイ、アラブ首長国連邦 7.15
インターナショナル スクール オブ バンコク、バンコク、タイ
アメリカン スクール オブ リオ デ ジャネイロ、リオ、ブラジル

American School of Budapest、ブダペスト、ハンガリー

Zurich International School、チューリッヒ、スイス

指定されたすべての学校の「AS atotal」行がグループ化されて平均化されるように、クエリを作成する方法を知りたいです。アメリカン スクール オブ ドバイの個々のレビュー スコアとして記載されている 7.15 で 7.31 を平均すると、正しい 7.23 になります。答えはすぐそこにありますが、それを結び付けることができないようです。

「スタイリング」の質問不足で申し訳ありません!

4

2 に答える 2

1

クエリをテストしませんでしたが、最初のクエリを次のように記述した方がよいと思います。

SELECT ROUND(AVG((Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10+Q11+Q12+Q13+Q14+Q15+
    Q16+Q17+Q18+Q19+Q20+Q21+Q22+Q23+Q24+Q25+Q26+Q27+Q28+Q29+Q30+
    Q31+Q32+Q33+Q34+Q35+Q36+Q37+Q38+Q39+Q40+Q41+Q42+Q43+Q44+Q45+
    Q46+Q47+Q48+Q49+Q50+Q51+Q52)/52),2) AS total
FROM reviews
WHERE schoolID='$schoolvalue'

書くのも読むのも簡単です。

2 番目のクエリの問題は、SELEC 句に集計関数 AVG がないことです。Iserni answer を見てください。正しいと思います。

于 2012-10-31T18:07:36.967 に答える
1

次のようなことを試しましたか

 SELECT schools.schoolName,
 ROUND(AVG(
 ((Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10+Q11+Q12+Q13+Q14+Q15+
 Q16+Q17+Q18+Q19+Q20+Q21+Q22+Q23+Q24+Q25+Q26+Q27+Q28+Q29+Q30+
 Q31+Q32+Q33+Q34+Q35+Q36+Q37+Q38+Q39+Q40+Q41+Q42+Q43+Q44+Q45+
 Q46+Q47+Q48+Q49+Q50+Q51+Q52)/(52*10)
 *10)),2) AS average
 FROM reviews
 RIGHT JOIN schools ON (schools.SID = reviews.schoolID)
 GROUP BY schools.SID
 ORDER BY average DESC;

最後のクエリには集計関数が含まれていないため、期待される結果が返されなかった可能性があります。

クエリをテストしていませんが、SQLFiddle またはサンプル テスト データを提供していただければ確認できます。

于 2012-10-31T17:53:07.293 に答える