Подсчитать количество записей по дереву подкатегорий

206
23 апреля 2022, 23:10

Подскажите пожалуйста, есть 2 таблицы:

1 - таблица категорий, и связей (cat2 и cat3 подчиняется cat1)

prod_category
id|name|parent_category|
1 |cat1|       0       |
2 |cat2|       1       |
3 |cat3|       1       |
4 |cat4|       3       |
5 |cat5|       3       |
6 |cat6|       0       |
7 |cat7|       6       |
8 |cat8|       0       |
9 |cat9|       8       |
10|cat10|      9       |

2 - таблица продуктов и их категории

products
id| name|category_id|
1 |prod1|     0     |
2 |prod2|     1     |
3 |prod3|     2     |
4 |prod4|     3     |
5 |prod5|     4     |
6 |prod6|     5     |
7 |prod7|     6     |
8 |prod8|     7     |
9 |prdo9|     8     |
10|prod10|    9     |

Я делаю sql цикл родительских категорий:

$stmt = $pdo->query("SELECT * FROM prod_category WHERE parent_category='0'");
while ($row = $stmt->fetch()) {
}

Далее мне нужно просчитать есть закреплена ли эта категория в продуктах (есть ли в ней продукты). Если нет, тогда взять категорию которая подчиняется (дочерняя) и посчитать есть ли в ней продукты, и до кона связей. Если продукты в какой либо категории (дочерней либо же в самой родительской) есть, тогда выводим $row['name'], если нет, тогда не выводим.

Answer 1

Вы можете использовать следующий код:

<?php
// get categoriies into array >>>
$sth = $pdo->prepare("select * from prod_category");
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
$categories = [];
foreach ($result as $c) {
    $categories[$c['id']] = $c;
};
// <<< get categoriies into array
// recursive function get product main category
function get_main_category($cat) {
    global $categories;
    
    return $categories[$cat]['parent_category'] == 0 
        ? $categories[$cat]['name']
        : get_main_category($categories[$cat]['parent_category']);
}
$sth = $pdo->prepare("select * from products");
$sth->execute();
$result = [];
while ($prod = $sth->fetch(PDO::FETCH_ASSOC)) {
    $prod['main_category'] = get_main_category($prod['category_id']);
    if (isset($res[$prod['main_category']])) $res[$prod['main_category']]++;
    else $res[$prod['main_category']] = 1;
}
print_r($res);

Здесь можно протестировать PHPize.online

READ ALSO
Mysql PHP Ловим массив на новой странице

Mysql PHP Ловим массив на новой странице

Есть страница с подробным описанием товара, у каждой свое idПользователь переходит на нее с другой страницы, допустим страница rent на ней выводятся...

221
Как из powershell скрипта записать кириллицу в MySQL (UTF-8)?

Как из powershell скрипта записать кириллицу в MySQL (UTF-8)?

Есть столбец таблицы с кодировкой utf8 (менять кодировку нельзя)

182