Как построить запрос для подсчета каждого значения в таблице рейтинга?
Есть таблица ratings с пятизвёздным рейтингом, со следующими значениями столбцов:
Schema::create('ratings', function (Blueprint $table) {
$table->bigIncrements('id')->unsigned(); //автоинкремент
$table->integer('id_post')->unsigned(); // id публикации
$table->integer('id_user')->unsigned()->nullable(); // id пользователя
$table->unsignedTinyInteger('rating'); // рейтинг, со значением от 1 до 5
});
Сейчас я делаю простой подсчёт и вывод среднего значения таким запросом:
select
AVG(rating) as avg,
COUNT(*) as amount
from
`ratings`
where
`id_post` = '1'
И в результате получаю:
$rating = [
'avg' => '3.400',
'amount' => 10
];
Вопрос: Как мне построить запрос, что бы подсчитывалось дополнительно и кол-во каждой звезды? То есть сколько человек поставило 1 звезду, сколько 2 звезды и т.д. Что бы результат был примерно таким:
$rating = [
'avg' => '3.400',
'amount' => 10,
'star_count1' => 2,
'star_count2' => 1,
'star_count3' => 1,
'star_count4' => 3,
'star_count5' => 3
];
Ответы (1 шт):
Автор решения: nomnoms12
→ Ссылка
Вы можете использовать функцию COUNT вместе с условным оператором IF, для того, чтобы считать только определённые значения.
SELECT
AVG(rating) as `avg`,
COUNT(*) as `amount`,
COUNT(IF(`rating` = 1, 1, NULL)) AS `star_count1`,
COUNT(IF(`rating` = 2, 1, NULL)) AS `star_count2`,
COUNT(IF(`rating` = 3, 1, NULL)) AS `star_count3`,
COUNT(IF(`rating` = 4, 1, NULL)) AS `star_count4`,
COUNT(IF(`rating` = 5, 1, NULL)) AS `star_count5`
FROM
`ratings`
WHERE
`id_post` = '1'