2012-01-03 19 views
3

こんにちは、mnesiaに別の選択要求をする可能性はありますか?Erlang - Mnesia - "テーブルから別のIDを選択する"と同等

etsには1つのテーブルの内容をコピーできますが、etsは動作可能なハッシュテーブルです。しかし、私はおそらくこの問題に対するより洗練された解決策があると思った。

ありがとうございます。

答えて

4

これはあなたが念頭に置いているかどうかは分かりませんが、QLCの{unique、true}オプションを使用することができます(詳細はQLC documentationを参照)。

私は、テストと呼ばれ、バッグセマンティクスを持つ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ライブラリをインクルードしなければならないことに注意してください。私の例では、別個のキーを選択しています。あなたは明確な値を選択したい場合は、ソートされた出力を望んでいた場合

> c("/home/jim/test", [{outdir, "/home/jim/"}]). 
> test:select_distinct(). 
> [4,1,2,3,5] 

をコンパイルし、実行している

-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 = qlc:sort(qlc:q([K || {_TName, K, _V} <- mnesia:table(test)], {unique, true})), 

上QH = ...行の次のバージョンを使用します次のように動作します。

QH = qlc:sort(qlc:q([V || {_TName, _K, V} <- mnesia:table(test)], {unique, true})), 
袋のために、それはユニークなキーのリストを得、私のテストから

mnesia:all_keys(Table). 

を:

はここでも、コードはちょうどあなたが使用して独自のキーのリストを取得することができ、キーのためのアプローチ

1

を説明することです。

関連する問題