2017-01-14 18 views

回答

2

有幾種方法可以解決這個問題。

得到的結果和SENDER_ID

這是迄今爲止最簡單的解決方案對它們進行排序。剛剛得到的結果(記錄列表),你通常會和sort the records通過SENDER_ID:

lists:sort(fun(A, B) -> 
    A#pm.sender_id < B#pm.sender_id 
end, Results). 

使用QLC:摺疊/ 3

這是更復雜一點,但它似乎有點使用普通老lists:sort/2更優雅。而不是返回一個列表它返回一個字典。

select_grouped_pms_for_recipient(RecipientId) -> 
    Q = qlc:q([E || E <- mnesia:table(pm), E#pm.recipient_id == RecipientId]), 
    qlc:fold(fun group/2, dict:new(), Q). 

group(Record, Acc) -> 
    dict:append(Record#pm.sender_id, Record, Acc). 

group/2函數我們推記錄到用於在dict累加器發送者ID的值的列表。 select_grouped_pms_for_recipient/1將返回結果dict,其中包含在發件人ID密鑰下分組的所有記錄的列表。

Erlang郵件列表是一個好問題和答案的寶庫。我在郵件列表中找到this question,這與您的問題非常相似。

哪個更快?

看着這些解決方案,我不確定在性能上會有很大的差異。我想他們大致相同,但是對於每個接收到的項目,在執行所有分組邏輯的過程中,通過qlc保持鎖定,因此它可以將Mnesia鎖持續一段時間。