Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 如何根据mnesia:match_object函数返回的id对对象进行分组_Erlang_Mnesia - Fatal编程技术网

Erlang 如何根据mnesia:match_object函数返回的id对对象进行分组

Erlang 如何根据mnesia:match_object函数返回的id对对象进行分组,erlang,mnesia,Erlang,Mnesia,我需要按发件人id对mnesia记录进行分组,以下是记录: -record(pm,{sender_id, recipient_id, msg, time}). 基本上,我需要获取所有recipient\u id=X的记录,并按sender\u id 最快的方法是什么 我认为情况是显而易见的。有几种方法可以解决这个问题 获取结果并按发件人id对其进行排序 这是迄今为止最简单的解决方案。只需按照您通常的方式和发件人id获取结果(记录列表): lists:sort(fun(A, B) ->

我需要按发件人id对mnesia记录进行分组,以下是记录:

-record(pm,{sender_id, recipient_id, msg, time}).
基本上,我需要获取所有
recipient\u id=X
的记录,并按
sender\u id

最快的方法是什么


我认为情况是显而易见的。

有几种方法可以解决这个问题

获取结果并按发件人id对其进行排序

这是迄今为止最简单的解决方案。只需按照您通常的方式和发件人id获取结果(记录列表):

lists:sort(fun(A, B) ->
    A#pm.sender_id < B#pm.sender_id
end, Results).
group/2
函数中,我们将记录推送到
dict
累加器中的发送者ID值列表中。
select\u grouped\u pms\u for\u recipient/1
将返回结果
dict
,其中包含按发件人ID键分组的所有记录的列表

Erlang邮件列表是一个很好的问题和答案的宝库。我在邮件列表上找到了,这与你的问题非常相似

哪个更快?


看看这些解决方案,我不确定性能是否会有很大差异。我想它们大致相同,但对于qlc,锁在所有分组逻辑执行期间都会被保留,因此它可能会保留Mnesia锁一段时间。

您使用的是什么版本的Erlang?
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).