我在尝试解决这个问题时遇到了一些麻烦。我有一个帐户图表,我想汇总货币栏。我的表“类别”有一个自动关系:
category_table
- id
- parent_id
- category
** 不知道账表有多深。它可以有 1,2,3,4,5...多个级别。
这是一个例子:
我想要的:
Category Name |$
-------------------------------
Category 1 |160.00
Category 1.1 |130.00
some expense | 50.00
some expense | 80.00
Category 1.2 | 30.00
some expense | 10.00
some expense | 20.00
-------------------------------
Category 2 |160.00
Category 2.1 |150.00
some expense |100.00
some expense |150.00
Category 2.1 | 70.00
some expense | 50.00
some expense | 20.00
-------------------------------
我有什么:
Category Name |$
-------------------------------
Category 1 | 0.00
Category 1.1 | 0.00
some expense | 50.00
some expense | 80.00
Category 1.2 | 0.00
some expense | 10.00
some expense | 20.00
-------------------------------
Category 2 | 0.00
Category 2.1 | 0.00
some expense |100.00
some expense |150.00
Category 2.1 | 0.00
some expense | 50.00
some expense | 20.00
-------------------------------
我已经在 php 中尝试过这个递归函数,但是没有用 =/
function display_children($parent) {
$sql = "SELECT c.id, c.category,
(SELECT COUNT(*) FROM category c1 WHERE c1.parent_id = c.id) As Total,
(SELECT SUM(p.value) FROM payables p WHERE p.category_id = c.id) As TotalToPay
FROM category c
WHERE c.parent_id = {$parent}
ORDER BY c.category";
$result = mysql_query($sql);
$ret = "<ul>";
$totalcategory = 0;
while ($row = mysql_fetch_assoc($result)) {
if ($row['Total'] > 0) {
$totalcategory = $totalcategory + (empty($row['TotalToPay']) ? 0 : $row['TotalToPay']);
$ret .= "<li><a href='#" . $row['id'] . "'>" . $row['category'] . " - " . $totalcategory . "</a>";
$ret .= display_children($row['id']);
$ret .= "</li>";
} elseif ($row['Total']==0) {
$totalcategory = ($totalcategory + empty($row['TotalToPay']) ? 0 : $row['TotalToPay']);
$ret .= "<li><a href='" . $row['id'] . "'>" . $row['category'] . " - " . $totalcategory . "</a></li>";
} else;
}
$ret .= "</ul>";
return $ret;
}
echo display_children(0);
它告诉我:
Category 1 - 0
Category 1.1 - 0
Category 1.2 - 0
expense 1 - 25.90
expense 2 - 0
expense 3 - 3.80
Category 2 - 0
Category 2.1 - 0
Category 2.2 - 0
Category 2.3 - 0
Category 3 - 0
Category 3.1 - 52.00
...有什么想法吗? ...谢谢 :)
最佳答案
如果你有一个像 3 这样的最大深度,你可以像这样用一个查询来完成:
SELECT c1.dollar + c2.dollar2 + c3.dollar AS dollar_sum
FROM category_table c1
LEFT JOIN category_table c2 ON c1.id = c2.parent_id
LEFT JOIN category_table c3 ON c2.id = c3.parent_id
如果您不知道层次结构的最大深度,您确实可以像这样在 php 中使用递归函数
function getSum($parent = null) {
if ($parent === null) {
$rows = // SELECT id, dollar FROM category_table WHERE parent_id IS NULL;
} else {
$rows = // SELECT id, dollar FROM category_table WHERE parent_id = $parent;
}
foreach ($rows as &$row) {
$children = getSum($row->id);
foreach ($children as $child) {
$row->dollar += $child->dollar;
}
}
return $rows;
}
关于php - Mysql/PHP - 账户图表 - 父账户中的汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649239/