【发布时间】:2012-02-01 04:10:30
【问题描述】:
您好,是否有可能向 mnesia 发出不同的选择请求?
我可以将一个表的内容复制到 ets,因为 ets 是一个哈希表,所以它可以工作。但我认为这个问题可能有更优雅的解决方案。
谢谢。
【问题讨论】:
标签: select erlang distinct mnesia
您好,是否有可能向 mnesia 发出不同的选择请求?
我可以将一个表的内容复制到 ets,因为 ets 是一个哈希表,所以它可以工作。但我认为这个问题可能有更优雅的解决方案。
谢谢。
【问题讨论】:
标签: select erlang distinct mnesia
对于键,您可以使用以下方法获取唯一键列表:
mnesia:all_keys(Table).
根据我的测试,对于包,它会产生一个唯一键列表。
【讨论】:
我不确定这是否是您的想法,但您可以使用 QLC 的 {unique, true} 选项(有关详细信息,请参阅 QLC documentation)。
我创建了一个名为 test 的 mnesia 表,具有包语义。每行由表名、一个键和一个值组成,所以我的行看起来像:
1. test, 1, 1
2. test, 2, 1
3. test, 2, 2
4. test, 3, 1
5. test, 3, 2
6. test, 3, 3
... etc.
然后这个简单的模块说明了我的方法。请注意,您必须包含 qlc 库,并且在我的示例中,我选择了不同的键。
-module(test).
-export([select_distinct/0]).
-include_lib("stdlib/include/qlc.hrl").
select_distinct()->
QH = qlc:q( [K || {_TName, K, _V} <- mnesia:table(test)], {unique, true}),
F = fun() -> qlc:eval(QH) end,
{atomic, Result} = mnesia:transaction(F),
Result.
编译运行
> c("/home/jim/test", [{outdir, "/home/jim/"}]).
> test:select_distinct().
> [4,1,2,3,5]
如果您想要排序输出,请使用上面的 QH = ... 行的以下版本
QH = qlc:sort(qlc:q( [K || {_TName, K, _V} <- mnesia:table(test)], {unique, true})),
如果您想选择不同的值,可以使用以下方法:
QH = qlc:sort(qlc:q( [V || {_TName, _K, V} <- mnesia:table(test)], {unique, true})),
同样,代码只是为了说明一种方法
【讨论】: