2014-06-19 42 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

您可以將聯繫人姓名添加到現有查詢中。見上面的編輯。不需要額外的索引。 –