我有具有树行为的表用户
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`lft` int(11) DEFAULT NULL,
`rght` int(11) DEFAULT NULL,
`user_email` varchar(255) NOT NULL DEFAULT '',
`user_password` char(100) NOT NULL DEFAULT '',
`user_name` varchar(255) NOT NULL DEFAULT ''
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
和桌面交易
CREATE TABLE `trades` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`requests` float DEFAULT NULL,
`trade_date_start` datetime DEFAULT NULL,
`trade_date_stop` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
现在我需要计算树中每个用户的所有“请求”总和(每个用户可以有数百条“交易”记录,新记录每 4 小时生成一次),这样我将得到(总和括号中的请求),这是计数 一个月范围内。
me-
|
|_ John (20)
| |
| |_ John2 (200)
| |_ Jane (233)
| |_ George (3233)
|
|_ Alena (500)
...
因此,每个月我都需要查看每个用户从当月第一天到当月最后一天的请求总和。 它必须尽可能快。有人可以帮助我吗?谢谢
最佳答案
这个问题需要通过递归查询来解决,而常用的 DBMS 中只有 MySQL 不支持递归查询。因此,我认为如果您与 MySQL 绑定(bind)在一起,您将需要自己执行必要的递归。每个查询可能具有以下形式:
SELECT
user_id,
SUM(requests) AS requests,
FROM
users
JOIN trades
ON users.id = trades.user_id
WHERE
users.parent_id = <PARENT_ID>
AND trade_date_start BETWEEN <WINDOW_START_TIMESTAMP> AND <WINDOW_END_TIMESTAMP>
GROUP BY user_id
您需要处理每个结果行,并对返回的每个 user_id 递归地发出相同类型的查询。
由于您可能会使用相同的日期过滤条件发出许多查询,因此您可以通过首先创建一个临时表来加快查询速度,该临时表仅包含交易
中属于感兴趣窗口的行,然后使用它(没有明确的日期条件)而不是表交易
。
关于php - MySQL:在 CakePHP 的树行为中对表中的字段进行求和的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28949735/