【问题标题】:Mysql - query including sum and inner joinMysql - 包括求和和内连接的查询
【发布时间】:2014-06-19 06:37:59
【问题描述】:

我们有如下表结构:

Accounts: id | name .....

交易:

account_id | order_year | amount .....

我们的数据库已经非常大 (>300.000) 帐户和交易 > 1.000.000

在我们的账户列表中,我们现在需要一个过滤器来搜索在 YYYY 年内总金额超过 XXXXEUR 的账户。

我们已经尝试过 subselect(inner Join 和 sum 但是我们的查询太慢了。

也许任何人都可以给我们一些关于如何进行有关性能查询的提示。

谢谢皮特

感谢您的快速答复....

现在我们还有与帐户相关的联系人如下:

帐户:id

联系人:身份证

account_contact: id |联系方式 | account_id

我们还需要在联系人中搜索所需的功能。

因此搜索在 XXX 年(总和)超过 YYYY EUR 交易的联系人。

非常感谢您的帮助

【问题讨论】:

  • 显示完整的表结构以及表可用的索引。
  • ... 以及到目前为止您尝试过的查询。
  • 请不要使用与问题无关的标签

标签: mysql sql


【解决方案1】:

试试这个:

select
  Accounts.id,
  sum(Transactions.amount) as TotalAmount
from
  Accounts
inner join
  Transactions on Transactions.account_id = Accounts.id
where
  order_year = YYYY
group by 
  Accounts.id
having
  sum(Transactions.amount) >= XXXX 

【讨论】:

  • anh GROUP BY 子句?也许group by Accounts.id
  • @MinhD 你是对的......写得比思考快有问题
  • 谢谢...我刚刚修改了我原来的问题并添加了一些关于第二次查询联系人的信息。也许你可以再帮忙一次……
【解决方案2】:

所以我在 MySQL 5.5 上的 SQL Fiddle http://sqlfiddle.com/#!2/3b45af/1/0 中建立了您的关系,并在其中填充了大约。 250,000 个账户和 1,000,000 笔交易。在测试数据上运行分析查询仅需 1-2 秒:

SELECT
   accounts.id
 , SUM(amount)
FROM accounts
JOIN transactions
  ON (accounts.id = transactions.account_id)
WHERE order_year = 2005
GROUP BY accounts.id
HAVING SUM(amount) > 1000000;

性能的关键部分是确保您已正确索引表。 accounts.id 你可能已经隐式索引了,因为它应该是一个 PK。另一个有帮助的索引是在transactions.order_year 上有一个非唯一索引:

CREATE INDEX transaction_year ON transactions(order_year);

transaction_year 索引的效率将取决于它的选择性。如果您有 20 年的交易量,那么该指数将有很大帮助。如果您只有 1-2 年的交易,该索引可能根本没有帮助。

编辑:

SELECT
   accounts.id
 , accounts.name
 , SUM(amount)
FROM accounts
JOIN transactions
  ON (accounts.id = transactions.account_id)
WHERE order_year = 2005
GROUP BY accounts.id, accounts.name
HAVING SUM(amount) > 1000000;

【讨论】:

  • 谢谢...我刚刚修改了我原来的问题并添加了一些关于第二次查询联系人的信息。也许你可以再帮忙一次……
  • 您可以将联系人姓名添加到现有查询中。请参阅上面的编辑。不需要额外的索引。
猜你喜欢
  • 2016-11-21
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2013-01-01
相关资源
最近更新 更多