2017-01-14 128 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锁持续一段时间。