php - MySQL:在 CakePHP 的树行为中对表中的字段进行求和的最快方法

标签 php mysql cakephp

我有具有树行为的表用户

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/

相关文章:

mysql - 如何在 order by 子句之后选择编号列

mysql - 如何编写具有多个字段的 mysql 查询(在 where 子句中具有组合)

cakephp - 将 CakePHP 的 Controller 拆分成几个文件

mysql - 为什么 count(id) 结果是 3 维数组?

php - 如何降级或安装特定版本的 Composer?

javascript - css 和 js 文件在 php 中不起作用

php - 有什么办法可以在特定时间自动触发mysql功能吗?在 mysql 5.0.91-log 上

mysql - 如何将 CommandText 传递给另一个 MySqlCommand?

javascript - Tokbox视频聊天查询

php - 在没有 formhelper 的情况下使用 CakePHP 检索 POST 数据