查询以使用不同的表构建类别和子类别导航

时间:2016-12-18 20:50:13

标签: php mysql

我在旧版的stackoverflow问题上搜索了这个问题,但我无法在这里找到解决问题的正确方法。

我在数据库中有2个表:

article_category表:

cat_id   category
1        Elektronics
2        Furniture

article_subcategory表:

id   cat_id   subcategory            total
1    1        Kitchen-elektronics      1
2    1        Computers                5
3    2        Kitchen furniture        2
4    2        Living room furniture    7

我想要做的是构建一个查询,用于输出HTML表格中的数据,如下所示:

                   <li>
                      <a href="#">
                         <div class="clearfix"><span class="pull-left">category items</span> <span class="pull-right">(total items)</span></div>
                      </a>

                      <ul class="test">

                         <li class="current"><a href="#">subcategory items (total items)</a></li>

                      </ul>
                   </li>

第一个 li 中的总项目必须是头类别下所有子项目的总项目。我已经做了一个基本查询,但我在这里只看到头类别下面的第一个子类别项。 如果可能的话,我想在不使用函数的情况下完成它,而是使用纯PHP。

SELECT 
   sc.subcategory,
   sc.total
   ac.category
FROM 
   article_category ac
JOIN
   article_subcategory sc
ON
   sc.cat_id = ac.cat_id
GROUP BY
   ac.cat_id

编辑:最终解决方案

<?php
         //Make connection to db

$sql = "
            SELECT 
               ac.category,
               sc.aantal,
               sc.subcategory ,
               group_concat(sc.subcategory) as items,
               group_concat(sc.aantal) as totals,
               SUM(sc.aantal) as mainItemsTotal,
               group_concat(CONCAT(sc.subcategory, '-', sc.aantal)) as items2
            FROM 
               article_category ac
            JOIN
               article_subcategory sc
            ON
               sc.cat_id = ac.cat_id
            GROUP BY
               ac.cat_id
            ORDER BY 
               ac.category asc, sc.subcategory asc
            "; 
$res = mysql_query($sql) or die (mysql_error());


         while($row = mysql_fetch_assoc($res)) {

?>
        <ul>
                <li><?php echo $row['category']; ?> (<?php echo $row['mainItemsTotal']; ?>)</li>
                        <?php 
                        $items = $row['items2'];
                        $items_array = explode(',',$items);

                        if(is_array($items_array) && count($items_array) > 0 ){
                        ?>
                            <ul>
                                <?php 
                                foreach($items_array as $item_name){ 

                                    $arr = explode('-',$item_name);
                                    if($arr[1] > 0) { ?>
                                       <li>
                                           <?php echo $arr[0] . ' ('. $arr[1]. ')'; ?>
                                       </li>
                                <?php 
                                    } 
                               } 
                               ?>
                            </ul>
                        <?php } ?>
        </ul>
<?php } ?>

现在我有了这个输出:

Elektronics (6)
   Kitchen-elektronics (1)
   Computers (5)

Furniture (9)
   Kitchen furniture (2)
   Living room furniture (7)

这一切都是正确的。未显示总计= 0的子项。

2 个答案:

答案 0 :(得分:1)

你很亲密。只需SUM总数。

以下是更新后的查询

  

GROUP_CONCAT(sc.total) AS subItemsTotal会为每个子项目提供逗号分隔总计。

     

SUM(sc.total) AS mainItemsTotal将为您提供所有子猫的总项目

   SELECT 
    ac.category,
    GROUP_CONCAT(sc.subcategory) AS items,
    GROUP_CONCAT(sc.total) AS subItemsTotal,
    SUM(sc.total) AS mainItemsTotal
FROM 
    article_category ac
JOIN
    article_subcategory sc
ON
    sc.cat_id = ac.cat_id
GROUP BY
    ac.cat_id

Working Fiddle

答案 1 :(得分:0)

我有另一个解决方案,你将不得不改变你的PHP代码,所以也许你不会使用它。但我认为以sql方式这是一个更好的解决方案:

我按照你要求的修饰符“WITH ROLLUP”使用组:http://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html

查询:

SELECT 
    ac.category,
    sc.subcategory AS items,
    SUM(sc.total) AS Total
FROM 
    article_category ac
JOIN
    article_subcategory sc ON sc.cat_id = ac.cat_id
GROUP BY ac.category,items WITH ROLLUP

结果:

|----------------------------------------|
|category   |items                |Total |
|----------------------------------------|
|Elektronics|Computers            |5     
|Elektronics|Kitchen-elektronics  |1
|Elektronics|NULL                 |6
|Furniture  |Kitchen furniture    |2
|Furniture  |Living room furniture|7
|Furniture  |NULL                 |9
|NULL       |NULL                 |15