У меня есть таблица под названием ranks
которая хранит значение 1-7 и связывает его с идентификатором item
и user
.
Пример: id | userid | value | itemid
id | userid | value | itemid
id | userid | value | itemid
.
Чтобы отобразить рейтинг элемента, я вычисляю сумму всех значений (1-7), где itemid=?
и разделите его на общее количество строк. Но у меня нет значения, хранящегося в самой таблице items
.
Получить средний рейтинг:
// total $stmt = $conn->prepare("SELECT SUM(value) as total FROM ranks WHERE itemid=?"); $stmt->bind_param("i", $id); $stmt->execute(); $stmt->bind_result($total); $stmt->fetch(); $stmt->close(); // num of rows $stmt = $conn->prepare("SELECT COUNT(value) FROM ranks WHERE itemid=?"); $stmt->bind_param("i", $id); $stmt->execute(); $stmt->bind_result($count); $stmt->fetch(); $stmt->close(); $avg = $total/$count;
Но я понятия не имею, как сортировать по самому высокому рейтингу, если у меня нет рейтинга, хранящегося в самой таблице items
. Возможно ли это с помощью отдельной таблицы ranks
?
Вы можете использовать avg()
для получения itemid по их наивысшей оценке. Это то же самое, что и получение суммы и деление на счет:
select avg(value), itemid from ranks group by itemid order by avg(value) desc
select itemid, total/cnt as avgrating from ( select itemid, sum(value) as total, count(*) as cnt from ranks group by itemid ) t order by total/cnt desc;
Вы можете получить средний рейтинг и отсортировать его с помощью подзапроса.