关于多对多关系数据的比较算法

作者: 傻猫    分类: 弄数据    发布时间: 06-20 08:45    浏览次数: 4905     无留言

昨天搞了一个小软件,主要分析多对多关系的数据,刚开始一直没有想到办法,后来想到了通过数据库数据读取来循环操作,功能实现了,但是要读取数据库很多次,效率感觉不行,于是又重新想了想,用动态数组的方法来实现,不读写数据库,速度也很快,而且充分发挥了CS客户端的效率,可以交由客户端来完成一些事务处理,这个是BS无法比的,哈哈。现将demo分享一下。

1、两张表,一个是学生信息表UserInfo,一个学科信息Project表

UserInfo信息如下

id,  name, myProject
1    tom     1,2,3,4
2    jim      1,3
3   sam      2,4

Project信息如下

id,name
1    math
2    english
3   chinese
4   Japanese

 myProject字段信息记录学生的科目信息,现在是需要在listview列表里显示某个学生的科目信息,所学科目打钩。

1、首先将所有科目信息填充到listview,第一列为科目ID

2、取出某学生的学科信息myProject值temp

第一种实现方法,通过数据库循环操作:

      for i:=0 to lv_hdtc.Items.Count-1 do
      begin
             //通过数据循环操作获取相关信息
            mysql:='select id from Project  where id in ('+temp+')';
            with data do
            begin
                  qry_temp.Close;
                  qry_temp.SQL.Clear;
                  qry_temp.SQL.Add(mysql);
                  qry_temp.Open;
                  for j:=0 to qry_temp.RecordCount-1 do
                  begin
                        if Trim(qry_temp.fieldbyname('id').AsString)=lvtxt then
                        lv_hdtc.Items.Item[i].Checked:=True;

                        qry_temp.FindNext;
                  end;
            end;
                       
      end;

第二种实现方法,使用动态数组:

    //mytc: array of string;
     i:=0;
     SetLength(mytc,Length(temp));
     while True do
     begin
             if Pos(',',temp)>0 then
             begin
                  SplitString(temp,',',l,r);
                  mytc[i]:=Trim(l);
                  temp:=Trim(r);
                  i:=i+1;
             end
             else
             begin
                 if i=0 then
                 mytc[0]:=Trim(temp)
                 else
                 mytc[i]:=Trim(temp);
                
                 Break;
             end;
     end;


      for i:=0 to lv_hdtc.Items.Count-1 do
      begin
            //通过本地数组格式化进行操作
            lvtxt:=Trim(lv_hdtc.Items.Item[i].Caption);

            for j:=0 to Length(mytc)-1 do
            begin
                  if Trim(mytc[j])=lvtxt then
                  lv_hdtc.Items.Item[i].Checked:=True;
            end;
          
      end;

 

添加新评论