Возвращение среднего рейтинга из базы данных (SQL) - PullRequest
1 голос
/ 18 ноября 2010

Я пытаюсь создать систему рейтинга, в которой пользователь может оценивать изображения / видео / аудио и т. Д. У меня есть две таблицы на данный момент

Table: products
Cols:  product_id[PK] | name | category | type | link

Это таблица продуктов и содержит информацию опродукты.Если вас смущают продукты, представьте «продукт» как изображение / видео / аудио, я назвал его так, чтобы мне было легче его понять.Вторая таблица - это рейтинги

Table: product_ratings
Cols:  rating_id[PK] | rating | product_id | timestamp

В этой таблице хранится информация о рейтинге, который дал пользователь.

Мне нужна страница, на которой будут отображаться самые высокие оценки (в среднем) для всех"товары".До сих пор я просматривал SA и нашел следующий фрагмент кода:

SELECT
p.product_id, p.name,
AVG(pr.rating) AS rating_average
FROM products p
INNER JOIN product_ratings pr
ON pr.product_id = p.product_id
WHERE p.product_id = 1

Это просто возвращает средний рейтинг для определенного product_id. Как мне получить ВСЕ product_ids и их среднее значение?рейтинг, и как бы я нашел самый высокий через PHP?

Я пытался:

WHERE p.product_id < 1 AND p.product_id < 30

Но это просто возвращает product_id из 2, с его именем и Average_rating, который я надеваюне понимаю.

Руководство / ссылки на материалы приветствуются

Ответы [ 3 ]

4 голосов
/ 18 ноября 2010
SELECT
    p.product_id,
    p.name,
    AVG(pr.rating) AS rating_average
FROM products p
INNER JOIN product_ratings pr
ON pr.product_id = p.product_id
GROUP BY p.product_id
ORDER BY rating_average DESC
LIMIT 1
4 голосов
/ 18 ноября 2010

Просто попробуйте:

SELECT
p.product_id, p.name,
AVG(pr.rating) AS rating_average
FROM products p
INNER JOIN product_ratings pr
ON pr.product_id = p.product_id

и это бессмысленное выражение:

WHERE p.product_id < 1 AND p.product_id < 30

, поскольку оно полностью эквивалентно

WHERE p.product_id < 1

, и я сомневаюсь, что выимеют идентификаторы ниже нуля

0 голосов
/ 18 ноября 2010

Ваш запрос близок. Просто удалите предложение WHERE, которое фильтрует все.

SELECT     p.product_id, p.name,
           AVG(pr.rating) AS rating_average
FROM products p
INNER JOIN product_ratings pr
ON pr.product_id = p.product_id
ORDER BY rating_average DESC

Это вернет вам средние значения для каждого продукта, отсортированные с самым высоким средним рейтингом в верхней части набора результатов.

...