繁体   English   中英

计算PHP MySQL中属于主要类别和子类别的帖子总数

[英]Count total posts belonging to main category and subcategories in PHP MySQL

我需要计算PHP / MySQL中属于主要类别及其子类别的帖子总数。 我有以下三个表:

tb_categories

在此处输入图片说明

tb_posts

在此处输入图片说明

tb_posts_to_categories

在此处输入图片说明

现在要获取属于一个类别及其所有子类别的帖子总数,我使用以下代码:

<?php
include("includes/db-config.php");

// Create connection
$connection = @mysqli_connect(DATABASE_HOST, DATABASE_USER, DATABASE_PASSWORD, DATABASE_NAME) 
or die(mysqli_connect_error());

    // Get total number of posts in a category
    function get_post_counts($category_id)
    {
        global $connection;
        $category_to_post = array();

        // Build database query
        $sql = "SELECT COUNT(`post_id`) AS `post_count`, `category_id` FROM `tb_posts_to_categories`  GROUP BY `category_id`";

        // Execute database query
        $rs = mysqli_query($connection, $sql);
        while($row = mysqli_fetch_assoc($rs))
        {
            $category_to_post[$row['category_id']] = $row['post_count']; 
        }

        // Build database query
        $sql2 = "SELECT `category_id`, `category_parent` FROM `tb_categories` WHERE `category_parent` <> 0";

        // Execute database query
        $rs2 = mysqli_query($connection, $sql2);

        while($row2 = mysqli_fetch_assoc($rs2))
        {
            $category_to_post[$row2['category_parent']] += $category_to_post[$row2['category_id']]; 
        }

        return $category_to_post[$category_id];
    }

$total_posts = get_post_counts(2);

echo $total_posts;

?>

产量

11

但是此输出不正确。 它应该等于8。但是,如果您提供子类别ID,则输出正确。 仅当将父类别ID提供给函数时,它才会混乱。

因为我有一对多的关系。 帖子可以分配到多个类别,甚至可以分配到其子类别。 再次计算与两个以上类别(一个主要类别及其子类别)相关的帖子,这使我得到的结果是11,而不是8。

但是,当帖子与两个不同的父类别或它们的任何子类别相关联时,该代码可以正常工作。 仅当帖子与主要类别及其多个子类别相关联时,才出现问题。 我们如何解决这种错误的计算? 请帮我这个家伙。 谢谢!

尝试使用此方法来统计类别及其直接子类别中的帖子。

SELECT COUNT(DISTINCT post_id)
FROM (
  (SELECT post_id
  FROM tb_posts_to_categories
  WHERE category_id = 2)
  UNION ALL
  (SELECT pc.post_id
  FROM tb_posts_to_categories pc
    JOIN tb_categories c ON pc.category_id = c.category_id
  WHERE c.category_parent = 2)
) AS t

这是另一个较小的变体:-)但是,如果WHERE包含OR条件,MySQL有时会卡在索引使用上。

SELECT COUNT(DISTINCT pc.post_id)
FROM tb_posts_to_categories pc
  JOIN tb_categories c ON pc.category_id = c.category_id
WHERE c.category_parent = 2 OR c.category_id = 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM