提取与 mnesia 中的值对应的多行

Extracting multiple row corresponding to a value in mnesia

情况是:- 我有像 {"Groupid(Primary key)"、"groupname"、"grouptype"、"creatorid"、"adminid"、"Member_list" 这样的失忆元组}.

Member_list="memberone@xyz,membertwo@xyz,memberthree@xyz"。现在我想提取所有那些行,其中 membertwo@xyz exists.How 在为此从 mnesisa 选择时应用保护??任何指针

现在在通过 sherif 给出的方法后出现以下错误

     in function  checktable1:getRecords/1 (checktable1.erl, line 201)

37> checktable1:getRecords("a")。 ** 异常错误:右侧值不匹配 {中止, {undef, [{strings,tokens,["a,b,c",","],[]}, {checktable1,存在,2, [{文件,"checktable1.erl"},{行,203}]}, {checktable1,'-getRecords/1-fun-1-',7, [{文件,"checktable1.erl"},{行,197}]}, {qlc,collect,1,[{file,"qlc.erl"},{line,1330}]}, {qlc,eval,2,[{file,"qlc.erl"},{line,296}]}, {mnesia_tm,apply_fun,3, [{文件,"mnesia_tm.erl"},{行,833}]}, {mnesia_tm,execute_transaction,5, [{文件,"mnesia_tm.erl"},{行,813}]}, {checktable1,getRecords,1, [{文件,"checktable1.erl"},{行,201}]}]}} 在函数 checktable1 中:getRecords/1(checktable1.erl,第 201 行)

你将不得不使用 mnemosyne

getRecords(ListMember)->  
    F = fun() ->
            Q = qlc:q(
                    [
                            Record
                            || Record <- mnesia:table(table_name_here),
                               exists(Record#table_name_here.member_list, ListMember)
                    ]),
            qlc:e(Q)
    end,
    {atomic, L}=mnesia:transaction(F),
    L.

然后你需要实现函数 exists(Member_list, Member) 扫描成员的 Member_list 和 returns 如果找到则为真,否则为假。别忘了

-include_lib("stdlib/include/qlc.hrl"). 

这不是合规的,只是为了演示。我可能还建议您更改数据库设计以避免扁平化列表(字符串形式的列表)或任何与此相关的列表作为值。如果可能的话,当然,我不知道你在做什么。你至少应该能够在那里放一个成员列表而不是一个字符串,这是 mnesia 你可以把任何东西放在任何 table 中的任何地方。但这并不意味着您应该这样做。

编辑:

exists(ML, M)->lookUp(string:tokens(ML, ","), M).
lookUp([], M)->false;
lookUp([M|R], M)->true;
lookUp([_|R], M)->lookUp(R,M).

如果您愿意,也可以使用以下内容代替 exists(Record#table_name_here.member_list, ListMember)。

lists:member(ListMember, string:tokens(Record#table_name_here.member_list, ","))