我在旧版的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的子项。
答案 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
答案 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