提取与 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, ","))
情况是:- 我有像 {"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, ","))