【问题标题】:Erlang - Mnesia - equivalent to "select distinct id from Table"Erlang - Mnesia - 相当于“从表中选择不同的 id”
【发布时间】:2012-02-01 04:10:30
【问题描述】:

您好,是否有可能向 mnesia 发出不同的选择请求?

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

谢谢。

【问题讨论】:

    标签: select erlang distinct mnesia


    【解决方案1】:

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

    mnesia:all_keys(Table).
    

    根据我的测试,对于包,它会产生一个唯一键列表。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-04-14
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        • 2012-03-10
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-04
        相关资源
        最近更新 更多