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

Select Erlang-Mnesia-相当于;从“表”中选择不同的id;,select,erlang,distinct,mnesia,Select,Erlang,Distinct,Mnesia,您好,是否有可能向mnesia提出明确的选择请求 我可以将一个表的内容复制到ets,因为ets是一个哈希表,所以它可以工作。但我认为也许有一个更优雅的解决方案来解决这个问题 谢谢。我不确定这是否是您的想法,但您可以使用QLC的{unique,true}选项(有关更多信息,请参阅) 我创建了一个名为test的mnesia表,它具有包语义。每行由表名、键和值组成,因此我的行看起来像: 1. test, 1, 1 2. test, 2, 1 3. test, 2, 2 4. test, 3, 1 5.

您好,是否有可能向mnesia提出明确的选择请求

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


谢谢。

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

我创建了一个名为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.
如果需要排序输出,请使用以下版本的QH=。。。上一行

    QH = qlc:sort(qlc:q( [K || {_TName, K, _V} <- mnesia:table(test)], {unique, true})),

QH=qlc:sort(qlc:q([K |{u TName,K,_V}对于键,您可以使用以下方法获得唯一键的列表:

mnesia:all_keys(Table).
根据我的测试,对于包,它会生成一个唯一密钥列表

QH = qlc:sort(qlc:q( [V || {_TName, _K, V} <- mnesia:table(test)], {unique, true})),
mnesia:all_keys(Table).