2012-01-03 87 views

回答

4

我不确定这是您的想法,但您可以使用QLC的{unique,true}选项(请参阅QLC documentation了解更多信息)。

我用bag语义创建了一个mnesia表,名为test,用bag语义。每行由表名称,关键字和值的,所以我的行看起来像:

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库,在我的示例中,我选择了不同的Keys。

-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

对于键,你可以用得到的唯一键的列表:

mnesia:all_keys(Table). 

从我的测试中,换袋它产生的唯一键的列表。