Как построить запрос для подсчета каждого значения в таблице рейтинга?

Есть таблица 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'
→ Ссылка