2015-02-27 3 views
2

Ситуация такова: - У меня есть кортежи mnesia, такие как {"Groupid (Primary key)", "groupname", "grouptype", "creatorid", "adminid", "Member_list"} ,Извлечение нескольких строк, соответствующих значению в mnesia

Member_list = «memberone @ хуг, membertwo @ хуг, memberthree @ хуг» .Теперь я хочу, чтобы извлечь все те строки, в которых membertwo @ хуг exists.How применять караул при выборе из mnesisa для этого ?? Есть указатели

Теперь после прохождения подхода дается следующая ошибкой шерифа появляется

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

37> checktable1: getRecords ("а"). ** ошибка исключения: совпадение значения правой стороны {aborted, {undef, [{строки, токены, ["a, b, c", ","], []}, {checktable1, существует, 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, линия 201)

+0

Его более типично для структурирования данных по-разному, с групповой таблицы, таблицы пользователей и таблицы членства - таблицы членства, содержащей {Group, User} кортежи, чтобы сделать поиск по критериям либо простым (и очень быстро) работа. – zxq9

+0

спасибо zxq9, но это не отвечает на мой вопрос – Geek

+0

Вот почему его комментарий. :-) – zxq9

ответ

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. 

то вам необходимо реализовать функции существует (Member_list, член), который сканирует Member_list для элемента и возвращает истину, если найдены и ложь в противном случае , dont забыли до

-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, ",")) 
+0

: -пожалуйста, обратитесь к редактируемому вопросу – Geek

+0

Huh ... Это просто простая отладка. Его строка: токены/2 не строки: токены/2. Я гарантирую, что есть другие ошибки, которые я никогда не компилировал. –

+0

Это сработало для меня. – Geek

Смежные вопросы