【问题标题】:Extracting multiple row corresponding to a value in mnesia提取与mnesia中的值对应的多行
【发布时间】:2015-04-29 19:36:10
【问题描述】:

情况是:- 我有 mnesia 元组,例如 {"Groupid(Primary key)","groupname","grouptype","creatorid","adminid","Member_list"}。

Member_list="memberone@xyz,membertwo@xyz,memberthree@xyz"。现在我想提取所有存在 membertwo@xyz 的行。如何在从 mnesisa 中选择时应用保护?任何指针

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

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

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

【问题讨论】:

  • 更典型的是用不同的方式构造数据,使用组表、用户表和成员表——成员表包含 {Group, User} 元组,使通过任一条件进行搜索变得简单(而且非常快)操作。
  • 感谢 zxq9 但这并不能回答我的问题
  • 这就是为什么它的评论。 :-)

标签: erlang ejabberd mnesia


【解决方案1】:

你必须使用助记符

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) 扫描成员列表中的成员,如果找到则返回 true,否则返回 false。别忘了

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

这没有被遵守,它只是为了演示。我是否还建议您更改数据库设计以避免扁平列表(字符串形式的列表)或任何与此相关的列表作为值。当然,如果可能的话,我不知道你在做什么。您至少应该能够将成员列表而不是字符串放在那里,这是 mnesia,您可以将任何内容放在任何表中的任何位置。但这并不意味着你应该这样做。

编辑:

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

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

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

【讨论】:

  • 呵呵...这只是简单的调试。它的 string:tokens/2 不是 strings:tokens/2。我保证我从未编译过其他错误。
猜你喜欢
  • 2015-04-14
  • 2017-03-22
  • 2020-10-26
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 2016-10-08
相关资源
最近更新 更多