2016-05-14 10 views
1

PHP/MySQLでメインカテゴリとそのサブカテゴリに属する​​投稿の総数をカウントする必要があります。PHPのメインカテゴリとサブカテゴリに属する​​投稿の総数をカウントするMySQL

tb_categories

enter image description here

tb_posts

enter image description here

tb_posts_to_categories

:私はによって与えられた3つのテーブルを持っています今総カテゴリに属する​​記事の数とそのすべてのサブカテゴリを得るために、私は次のコードを使用してい

enter image description here

<?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; 

?> 

出力

しかし、この出力は正しくありません。サブカテゴリIDを指定した場合、出力は正しいです。親カテゴリIDが関数に与えられると、それはちょっと混乱します。

私は1対多の関係を持っています。投稿は複数のカテゴリに割り当てられ、さらにそのサブカテゴリにも割り当てられます。 2つ以上のカテゴリ(1つのメインカテゴリとそのサブカテゴリ)に関連付けられた投稿が再び計算され、8の代わりに結果11が返されます。

ただし、投稿が2つの異なる親カテゴリまたはそのいずれかに関連付けられている場合サブカテゴリ。この問題は、投稿がメインカテゴリと複数のサブカテゴリに関連付けられている場合にのみ発生します。どうやって間違った計算を修正できますか?この人に私を助けてください。ありがとう!

+0

メインクエリで 'SELECT COUNT(distinct post_id)AS post_count'を試してください。 –

+0

動作しませんでした。メインのクエリで 'category_id'が必要です。 \ 'COUNT(DISTINCT \' post_id \ ')\ 'を単独で使うことはできません。その後、エラーが発生します。 'category_id'でそれを使うことは効果がありません。同じ結果。 – user5307298

答えて

2

カテゴリ内の投稿を数えてみると、それは直接のサブカテゴリです。

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 

これは :-)別の、小さな変形である。しかしWHEREOR条件が含まれている場合、MySQLは時々、インデックスの使用にstuckedます。

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 
+0

それはうまくいったけど、もう少し複雑で長いと思われる。他の簡単なソリューションはありませんか? – user5307298

+0

OK、私は小さな例を追加しました。 – Andrew

+0

うわー!それは魅力のように働いた。あなたは私の一日を救った。あなたへの帽子は、@アンドリュー。ありがとう。 – user5307298

関連する問題