2014-06-19 43 views
0

我们有如下表结构:MySQL的 - 查询包括和与内部连接

Accounts: id | name ..... 

交易:

account_id | order_year | amount ..... 

我们的数据库中已经是非常大的(> 300.000)账户和交易> 1.000。 000

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

我们已经与子查询尝试(INNER JOIN和sum,但我们的疑问是过于缓慢。

也许任何人都可以连锁行业我们如何使有关业绩这个查询的一些提示。

感谢皮特

感谢您的快速answeres ....

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

账号:ID

联系人:ID

account_contact:ID | contact_id | account_id

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

因此,搜索XXX年以上(总计)超过YYYY EUR交易的联系人。

任何帮助

+2

显示完整的表结构与可用于表的索引一起。 –

+1

...以及您到目前为止尝试过的查询。 –

+0

请不要使用与 – DanFromGermany

回答

2

千恩万谢试试这个:

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 
+1

anh GROUP BY子句无关的标签?也许'按帐户分组。id' – MinhD

+0

@MinhD你是对的......写得比思考更快有问题 – georstef

+0

谢谢......我刚刚修改了我原来的问题,并添加了关于联系人的第二个查询的一些信息。也许你可以再次帮助... – user3755249

0

所以我的工作你的关系SQL小提琴http://sqlfiddle.com/#!2/3b45af/1/0在MySQL 5.5,并与约填充它。 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; 
+0

非常感谢这四个.. – user3755249

+0

谢谢...我只是修改了我原来的问题,并添加了一些关于第二个查询联系人的信息。也许你可以再次提供帮助...... – user3755249

+0

您可以将联系人姓名添加到现有查询中。见上面的编辑。不需要额外的索引。 –