Как получить количество постов категории?

Рейтинг: 0Ответов: 1Опубликовано: 26.02.2023

Доброй ночи

Задавал подобный вопрос, но неверно сформулировал его и по понятной причине не получил полезного ответа. Попробую изложить здесь.

Дано: две таблицы — categories (id[int], category[text], dateadd[text]) и pages (id[int], title[text], categoryid[int], dateadd[text], text[text]), контроллер, модель для вывода списка категорий и модель для их подсчёта. Таблицы связаны внешним ключом.

Задача — вывести список из ссылок на категории, где после каждой из них указано привязанное к ней количество статей: Категория: Лишайники (25) Категория: Протисты (12) и т. д. На сколько я понимаю, нужно получить массив с категориями и впихнуть в него каким-то образом данные из другого массива с int значениями количества постов.

Вот так я пытаюсь это сделать. Контроллер:

public function categoriesAction()
{
    $pagination = new Pagination($this->route, $this->model->categoriesCount(), 20);
    $vars = [
        'pagination' => $pagination->get(),
        'count' => $this->model->categoriesCount(),
        'list' => $this->model->categoriesList($this->route),
        // 'pages' => $this->model->pagesCount(['id']),
    ];

    $this->view->render('Список категорий', 0, 0, $vars);
}

Модель для получения списка категорий:

public function categoriesList($route)
{
    $max = 20;
    $params = [
        'max' => $max,
        'start' => (($route['page'] ?? 1) - 1) * $max,
    ];
    // return $this->db->all('SELECT * FROM `categories` ORDER BY category ASC LIMIT :start, :max', $params); // Выводит только список категорий с ссылками

    return $this->db->all('SELECT categories.*, pages.categoryid, pages.id FROM categories, pages ON categories.id = pages.categoryid ORDER BY categories.category ASC LIMIT :start, :max', $params);
}

Это модель для подсчёта постов (видимо, бессмысленна):

public function pagesCount($id)
{
    $params = [
        'id' => $id,
    ];
    return $this->db->col('SELECT COUNT(id) FROM pages WHERE category = :id', $params);
}

Подскажите пожалуйста, как реализовать мою задачу?

Ответы

▲ 1Принят

Простая выборка с группировкой.

SELECT 
    c.id, c.category, c.dateadd, 
    COUNT(DISTINCT pages.id) as pages_count 
FROM categories c 
    LEFT JOIN pages p ON p.categoryid = c.id 
GROUP BY c.id

То же самое можно сделать подзапросом:

SELECT 
    id, category, dateadd,
    (
        SELECT 
            COUNT(id) 
        FROM pages 
        WHERE pages.categoryid = categories.id
    ) as pages_count
FROM categories