Erlang - Mnesia - 相当于 "select distinct id from Table"

3

您好,有没有可能对Mnesia进行不同的选择请求?

我可以将一个表的内容复制到ETS中,由于ETS是哈希表,所以可能会起作用。但我认为可能有更优雅的解决方案。

谢谢。

2个回答

4

我不确定这是否符合您的意图,但是您可以使用 QLC 的 {unique, true} 选项(有关更多信息,请参见 QLC 文档)。

我创建了一个具有 bag 语义的 Mnesia 表,名为 test。每行由表名称、Key 和 Value 组成,因此我的行看起来像:

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

如果您想获取键列表,可以使用以下命令获取唯一键列表:

mnesia:all_keys(Table).

从我的测试来看,对于包,它会生成一个唯一键列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接