MySQL:在 CakePHP 的树行为中对 table 中的字段求和的最快方法
MySQL: Fastest way to sum fields in table within Tree behavior in CakePHP
我有 table 个用户有树行为
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;
和table交易
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;
现在我需要计算树中每个用户的所有 'requests' 总和(每个用户可以有超过数百条 'trades' 记录,新记录每 4 小时生成一次)所以我会得到(括号中的请求总和)这是计数
在一个月的范围内。
me-
|
|_ John (20)
| |
| |_ John2 (200)
| |_ Jane (233)
| |_ George (3233)
|
|_ Alena (500)
...
所以每个月我都需要查看每个用户从当月第一天到当月最后一天的请求总和。
它必须尽可能快。有人能帮帮我吗?谢谢
这个问题需要通过递归查询来解决,常用的DBMS中只有MySQL不支持。因此,我认为如果您受限于 MySQL,您将需要自己执行必要的递归。每个查询可能具有以下形式:
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 发出相同类型的查询。
由于您可能会发出许多具有相同日期过滤条件的查询,因此您可以通过首先创建一个临时 table 来加快速度,该临时 table 仅包含 trades
中属于window 感兴趣,然后使用它(没有明确的日期条件)而不是 table trades
.
我有 table 个用户有树行为
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;
和table交易
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;
现在我需要计算树中每个用户的所有 'requests' 总和(每个用户可以有超过数百条 'trades' 记录,新记录每 4 小时生成一次)所以我会得到(括号中的请求总和)这是计数 在一个月的范围内。
me-
|
|_ John (20)
| |
| |_ John2 (200)
| |_ Jane (233)
| |_ George (3233)
|
|_ Alena (500)
...
所以每个月我都需要查看每个用户从当月第一天到当月最后一天的请求总和。 它必须尽可能快。有人能帮帮我吗?谢谢
这个问题需要通过递归查询来解决,常用的DBMS中只有MySQL不支持。因此,我认为如果您受限于 MySQL,您将需要自己执行必要的递归。每个查询可能具有以下形式:
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 发出相同类型的查询。
由于您可能会发出许多具有相同日期过滤条件的查询,因此您可以通过首先创建一个临时 table 来加快速度,该临时 table 仅包含 trades
中属于window 感兴趣,然后使用它(没有明确的日期条件)而不是 table trades
.