0

多くの製品があり、リストが大きくなるいくつかの製品を取得するクエリがあります

SELECT pid, link, created_at FROM products ORDER BY timestamp DESC

pidしかし、 andratingフィールドを含む別のテーブルもあります。これpidは製品テーブルへのリンクです。

SELECT AVG(rating) FROM ratings GROUP BY pid

以下のような情報を引き出すようにクエリするにはどうすればよいですか?

products.pid, products.link, products.created_at, AVG(ratings.rating)
4

4 に答える 4

1

MySQL では、これで目的の結果が得られるはずです。

SELECT p.pid, p.link, p.created_at, AVG(r.rating) rating
FROM products p
LEFT JOIN ratings r
  ON p.pid=r.pid
GROUP BY p.pid;

でテストする SQLfiddle

補足として、MySQL は不完全なGROUP BYクエリを実行できるという点で特別です。そのため、別のデータベースで実行したい場合 (またはスタイル上の理由で)、クエリは次のようにする必要があります。

SELECT p.pid, p.link, p.created_at, AVG(r.rating) rating
FROM products p
LEFT JOIN ratings r
  ON p.pid=r.pid
GROUP BY p.pid, p.link, p.created_at;
于 2013-06-22T17:17:58.250 に答える
0

上記の他の投稿を使用すると、常にこのエラーが表示されました。

'Unknown column "timestamp" in "order clause"'

製品テーブルの created_at 列にタイムスタンプが追加されていると思います。したがって、この列自体の順序付けを使用しました。製品テーブルから最後の行を選択し、AVG(評価) を出力します。

SELECT products.pid, products.link, products.created_at, AVG(ratings.rating)
FROM products, ratings
WHERE products.pid = ratings.pid
GROUP BY products.pid
ORDER BY products.created_at ASC
; 

このクエリはテスト済みで、問題なく動作しています。

于 2013-06-22T18:34:48.920 に答える
0
SELECT p.pid, link, created_at, avg_rating
FROM products p
JOIN (SELECT pid, AVG(rating) avg_rating
      FROM ratings
      GROUP BY pid) a
ON p.pid = a.pid
ORDER BY timestamp DESC
于 2013-06-22T17:18:21.200 に答える