2016-08-17 10 views
0

私はフードレビューのウェブページを行っています。トップ10と呼ばれるページがあり、フードレビューでトップ10を表示します。私は現在このSQLを持っていますが、それはすべての皿の評価を組み合わせ、1つの料理として結合します。このSQL文はPHPコード内に置かれています。SQL文が正しくグループ化されていません

SELECT i.path, i.name, AVG(r.review_rating), r.image_id 
    FROM images i, review r 
WHERE r.image_id = i.id 
GROUP BY 'r.image_id' 
ORDER BY AVG(r.review_rating) DESC 
LIMIT 10 
+0

ようこそスタックオーバーフロー。すぐに[About]ページと[Ask]ページをお読みください。 「うまくいきません」というのは、問題の良い特徴ではありません。 SQLでは、クエリの各テーブルのアウトライン・スキーマを参照する必要があります。データの行数は2〜5かかります。また、表示内容と表示内容についての説明も必要です。正式なスキーマなしで単に表名、列名およびサンプル値を与えるだけで十分です。 –

+0

GROUP BY句の 'r.image_id'の前後にある引用符は何ですか?それらは一重引用符で表示されるため、定数文字列でグループ化しています。グループ化の '列'(値)に値が1つしかないため、グループが1つしかないことがあります。 MySQLを使用している場合(SQLの質問で使用しているDBMSを特定することをお勧めします)、 '' GROUP BY 'r'.'' image_id'' 'を使うつもりです。 BY r.image_id'。 –

+0

旧式の 'FROM table1、table2'表記は、SQL-92で廃止されました。 20年以上経ってから書かれたSQLでは使用しないでください。 –

答えて

1

sqlスキーマが表示されていないと、変更する必要があるものを正確に知ることは難しいです。しかし、複数のテーブルから選択するのではなく、JOINを使用するように思えます。この何か試してみてください:

SELECT i.path, 
    i.name, 
    AVG(r.review_rating), 
    r.image_id 
FROM images i 
JOIN review r ON r.image_id = i.id 
GROUP BY r.image_id 
ORDER BY AVG(r.review_rating) DESC 
LIMIT 10 

をあなたは10個の異なるイメージ実際に存在していることを確認することも必要があります(10の以上のユニークなr.image_id年代は、あなたがGROUP BYを削除し、その結果を見て、これを確認することができます。)。

これが機能しない場合は、スキーマを投稿してください。

+0

私は10以下があれば、それがどれくらいあるかを表示しますか? – user3567749

+0

@ user3567749:10行未満の場合、使用可能なすべての行が表示されます。 –

1

問題はGROUP BY 'r.image_id'にあります。
'r.image_id'は文字列で、GROUP BYWHERE句でフィルタリングされたすべての行から1つのグループを作成します。

おそらくGROUP BY r.image_idが必要です。

apostrophes, quotes and backticksをMySQLで使用する場合の詳細については、こちらをご覧ください。

関連する問題