0

我有一个表 member_details 字段为“preferred_location”(varchar),其中包含来自列表框选择的逗号分隔值,如“19,20,22”......

现在我还有另一个表 city_master 具有字段“city_id”(int)和“city_name”(varchar)......

现在我想分离“preferred_location”(varchar)值并将它们添加到临时表的整数字段中,这样我就可以在临时表的city_id(int)和city_master的city_id(int)之间进行内部连接,然后可以获得城市来自 city_master 的 city_name 的名称...

这是我在 MySQL 中需要的所有东西——存储过程或函数。我将它与 c#.net 一起使用。

4

4 回答 4

1

坦率地说,这听起来像是一个糟糕的设计。如果您需要单独的整数值,则相应地修改您的数据库结构,并单独保存这些值以开始。

我的意思是,您会看到它导致的位置 - 因为您将值作为列表存储在字符串中,所以您已经将自己操纵到每次想要加入表格时都需要展开值的位置。

这就像把马放在马车后面。

于 2009-12-30T07:18:24.280 回答
0

如果这些整数很小,例如 19、20、22 等,只需使用更小的 16 位或 8 位整数(由您的数据库支持),并且它不应该比字符串占用更多空间(可能甚至更少)。

于 2009-12-30T07:20:31.943 回答
0

制作了一些模拟示例,但这也适用于 LinqToMySql。

class user {
public string name {get;set;}
public int id {get;set;}
}
class member_detail {
public int user_id {get;set;}
public string prefered {get;set;}
}

class city_master{
public int code {get;set;}
public string name {get;set;}
}
void Main()
{
var users = new List<user>();
users.Add(new user(){name = "Mary",id = 1});
users.Add(new user(){name = "John",id=2});
    var details = new List<member_detail>() ;
    details.Add(new member_detail(){user_id=1,prefered="1,2,3"});
    details.Add(new member_detail(){user_id=2,prefered="3,5"});
    var cities = new List<city_master>();

    cities.Add(new city_master(){code =1,name="Moscow"});
    cities.Add(new city_master(){code =2,name="London"});
    cities.Add(new city_master(){code =3,name="Paris"});
    cities.Add(new city_master(){code =4,name="Rome"});
    cities.Add(new city_master(){code =5,name="Madrid"});

    users.Select(u=>new {u.name,cities=
    details.Where(d=>d.user_id==u.id)
    .SelectMany(d=>d.prefered.Split(','))
    .Join(cities,c=>c,d=>d.code.ToString(),(a,b)=>new {b.name})}).Dump();

}
于 2009-12-30T08:56:00.563 回答
0

感谢您的建议,但在我的情况下,最好将首选位置城市的 ID 存储为逗号分隔。

我有一个创建临时表的过程,然后我可以使用city_master表内连接来获取城市名称。

Create Procedure parseAndStoreList(in thingId int, in i_list varchar (128), 
                                   out returnCode smallInt) 
BEGIN 
         DECLARE v_loopIndex default 0;
         DECLARE Exit Handler for SQLEXCEPTION 
BEGIN
        call saveAndLog(thingId, 'got exception parsing list');
        set returnCode = -1;
END;

call dolog(concat_ws('got list:', i_list)); 
          pase_loop: LOOP set v_loopIndex = v_loopIndex + 1; 
call dolog(concat_wc(',', 'at loop iteration ', v_loopIndex);
          LOOOP parse_loop; 
set returnCode = 0;
END; 
于 2009-12-30T11:05:58.803 回答