Erlang - Mnesia - 相当于“从表中选择不同的id”

时间:2012-01-03 00:56:36

标签: select erlang distinct mnesia

您是否有可能向mnesia发出明确的选择请求?

我可以将一个表的内容复制到ets,因为ets是一个哈希表,它可以工作。但我认为这个问题可能有更优雅的解决方案。

谢谢。

2 个答案:

答案 0 :(得分:4)

我不确定这是否是您的想法,但您可以使用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})),

同样,代码只是为了说明一种方法

答案 1 :(得分:1)

对于键,您可以使用以下方法获取唯一键列表:

mnesia:all_keys(Table).

从我的测试中,对于行李,它会产生一系列唯一键。