mysql无限极 统计_TP5,MySQL如何实现无限级查询统计

本文介绍如何在ThinkPHP 5 (TP5) 框架中配合MySQL数据库解决用户表中无限级关系的查询问题,通过递归函数实现每个用户及其下级的销售总额统计。面对超过256层的递归限制,我们将探讨优化方法和代码调整策略。
摘要由CSDN通过智能技术生成

TP5,MySQL如何实现无限级查询统计

---------

场景:

有一个用户表,表内人员是无限级关系,

有一个销售表,表内是人员的销售流水记录

数据表如下:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------

-- Table structure for user

-- ----------------------------

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (

`id` int(10) NOT NULL AUTO_INCREMENT,

`pid` int(10) DEFAULT NULL,

`name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of user

-- ----------------------------

INSERT INTO `user` VALUES ('1', '0', 'aaa');

INSERT INTO `user` VALUES ('2', '0', 'bbb');

INSERT INTO `user` VALUES ('3', '0', 'ccc');

INSERT INTO `user` VALUES ('4', '1', 'ddd');

INSERT INTO `user` VALUES ('5', '2', 'eee');

INSERT INTO `user` VALUES ('6', '1', 'fff');

INSERT INTO `user` VALUES ('7', '1', 'ggg');

INSERT INTO `user` VALUES ('8', '4', 'hhh');

INSERT INTO `user` VALUES ('9', '5', 'jjj');

INSERT INTO `user` VALUES ('10', '9', 'kkk');

INSERT INTO `user` VALUES ('11', '10', 'mmm');

INSERT INTO `user` VALUES ('12', '11', 'nnn');

-- ----------------------------

-- Table structure for sale

-- ----------------------------

DROP TABLE IF EXISTS `sale`;

CREATE TABLE `sale` (

`id` int(10) NOT NULL AUTO_INCREMENT,

`userid` int(10) DEFAULT NULL,

`moneys` int(20) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of sale

-- ----------------------------

INSERT INTO `sale` VALUES ('1', '1', '10');

INSERT INTO `sale` VALUES ('2', '2', '20');

INSERT INTO `sale` VALUES ('3', '3', '30');

INSERT INTO `sale` VALUES ('4', '4', '10');

INSERT INTO `sale` VALUES ('5', '5', '20');

INSERT INTO `sale` VALUES ('6', '6', '20');

INSERT INTO `sale` VALUES ('7', '7', '10');

INSERT INTO `sale` VALUES ('8', '8', '10');

INSERT INTO `sale` VALUES ('9', '9', '30');

INSERT INTO `sale` VALUES ('10', '10', '50');

INSERT INTO `sale` VALUES ('11', '12', '10');

INSERT INTO `sale` VALUES ('12', '11', '20');

INSERT INTO `sale` VALUES ('13', '2', '10');

INSERT INTO `sale` VALUES ('14', '5', '20');

INSERT INTO `sale` VALUES ('15', '6', '10');

INSERT INTO `sale` VALUES ('16', '7', '20');

INSERT INTO `sale` VALUES ('17', '11', '10');

INSERT INTO `sale` VALUES ('18', '12', '20');

INSERT INTO `sale` VALUES ('19', '6', '20');

INSERT INTO `sale` VALUES ('20', '8', '50');

2b416ede1e55d8b093262b2802635413.png

b38e8f904d711643bc9a955424093452.png

问题:

如何在TP5框架下找出每个人和下级的所有销售量总和?

代码部分<?php

namespace app\index\controller;

use think\Controller;

class Index extends Controller {

public function index() {

$user = db('user')->select();

$sales = db('sale')->select();

$res = array();

foreach ($user as $vau) {

$vau['mysum'] = $this->getmysum($sales, $vau['id']);

//            $vau['allsum'] = $this->getallsum($sales,$user, $vau['id']);

$vau['allsum'] = "";

array_push($res, $vau);

}

//

$this->assign('user', $res);

return view();

}

/**

* 求所有下级销售总量

* @param array $sales

* @param array $user

* @param $id

* @return int

*/

public function getallsum($sales = array(), $user = array(), $id) {

$money = 0;

foreach ($user as $vu) {

if ($vu['pid'] == $id) {

//找出当前下级个人总销售量

$money = $money + $this->getmysum($sales, $vu['id']);

//递归下级所有总销售量

$money = $money + $this->getallsum($sales, $user, $vu['pid']);

}

}

return $money;

}

/**

* 求个人销售总量

* @param array $sales

* @param $id

* @return int

*/

public function getmysum($sales = array(), $id) {

$money = 0;

foreach ($sales as $vs) {

if ($vs['userid'] == $id) {

$money = $money + $vs['moneys'];

}

}

return $money;

}

}9b35c471042108fb287f231225eaa47b.png

现在问题是,写在tp5函数部分的代码,一使用就报错,

致命错误: Maximum function nesting level of '256' reached, aborting!

求问大家,有什么好办法达到我查询统计的目的?

23164a1f4be24160f1172a9c7208ac30.gif

saletest.zip

( 3.1 MB 下载:8 次 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值