在MySQL中计算复杂的累积值

在MySQL中计算复杂的累积值,mysql,Mysql,本文底部列出了相关的表格和尝试的解决方案。目标和问题如下所述 目标 此查询的目标是构建下面的PHP对象数组(返回的行)。这是用户筛选的每个货币对的每个交易的时间戳历史记录。我能够实现除累计数量值以外的所有目标 'BTC-USD' => array( array( 'timestamp' => (int), 'price' => (float), 'price_usd' => (float), 'buy_sell' => (bool

本文底部列出了相关的表格和尝试的解决方案。目标和问题如下所述

目标

此查询的目标是构建下面的PHP对象数组(返回的行)。这是用户筛选的每个货币对的每个交易的时间戳历史记录。我能够实现除
累计数量
值以外的所有目标

'BTC-USD' => array(
  array(
    'timestamp' => (int),
    'price' => (float),
    'price_usd' => (float),
    'buy_sell' => (bool),
    'quantity' => (float),
    'total_value' => (float),
    'total_value_usd' => (float),
    'cumulative_quantity' => (float),
    'cumulative_quantity_base' => (float)
  )
)
问题

计算
pf_items
中每个用户行的累计数量还需要检查
buy_-sell
字段是0(销售)还是1(购买),并相应地进行加减

由于
累计数量\u基数
要求将BTC-USD和(例如)BTC-EUR的
数量
值合并到一个简单的BTC对象数组下,因此这一点变得稍微复杂一些。例如,如果与BTC-USD(
base\u currency
quote\u currency
)相关的
pf\u items
中的一行的购买量为5,而与BTC-EUR相关的另一行的购买量为7,则需要找到这两行的BTC累积值:12

pf\U货币

CREATE TABLE `pf_currencies` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `symbol` varchar(255) NOT NULL
);
CREATE TABLE `pf_portfolios` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `date_added` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `pf_items` (
  `id` int(11),
  `portfolio_id` int(11),
  `action_date` date,
  `price` float,
  `price_usd` float,
  `buy_sell` tinyint(1),
  `quantity` float,
  `base_currency` int(11),
  `quote_currency` int(11),
  `date_added` datetime
)
pf\U历史记录

CREATE TABLE `pf_currencies_history` (
  `id` int(11) NOT NULL,
  `base_currency` int(11) NOT NULL,
  `quote_currency` int(11) NOT NULL,
  `price` float NOT NULL,
  `date_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
);
pf\U投资组合

CREATE TABLE `pf_currencies` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `symbol` varchar(255) NOT NULL
);
CREATE TABLE `pf_portfolios` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `date_added` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `pf_items` (
  `id` int(11),
  `portfolio_id` int(11),
  `action_date` date,
  `price` float,
  `price_usd` float,
  `buy_sell` tinyint(1),
  `quantity` float,
  `base_currency` int(11),
  `quote_currency` int(11),
  `date_added` datetime
)
pf\U项目

CREATE TABLE `pf_currencies` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `symbol` varchar(255) NOT NULL
);
CREATE TABLE `pf_portfolios` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `date_added` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `pf_items` (
  `id` int(11),
  `portfolio_id` int(11),
  `action_date` date,
  `price` float,
  `price_usd` float,
  `buy_sell` tinyint(1),
  `quantity` float,
  `base_currency` int(11),
  `quote_currency` int(11),
  `date_added` datetime
)
我的查询 此查询实现除所述的
累计数量
累计数量
之外所需的内容

SELECT (SELECT
         symbol
       FROM pf_currencies
       WHERE a.base_currency = id)
       AS base_currency,
       (SELECT
         symbol
       FROM pf_currencies
       WHERE a.quote_currency = id)
       AS quote_currency,
       a.price,
       UNIX_TIMESTAMP(a.date_time) AS unix_time
FROM pf_currencies_history a
INNER JOIN pf_items i
  ON i.portfolio_id = (SELECT
    id
  FROM pf_portfolios
  WHERE user_id = ".$userId.")
  AND a.base_currency = i.base_currency
  AND a.quote_currency = i.quote_currency
ORDER BY unix_time DESC

STR_TO_DATE(a.DATE_time,“%Y-%m-%d%H:%i:%s”)-erm,这是做什么的?将我的日期字符串YYYY-MM-DD 00:00:00转换为unix时间戳编号。UNIX_TIMESTAMP就是这样做的。是的,我同意@草莓,这种转换完全没有必要。谢谢,我已经编辑并更新了上面的查询。