0

リストボックスの選択から取得した「19,20,22」のようなコンマ区切りの値を持つフィールド「preferred_location」(varchar)を持つ1つのテーブルmember_detailsがあります...。

これで、フィールド「city_id」(int)と「city_name」(varchar)を持つ別のテーブルcity_masterもあります。

ここで、「preferred_location」(varchar)値を分離し、それらを一時テーブルの整数フィールドに追加して、一時テーブルのcity_id(int)とcity_masterのcity_id(int)を内部結合し、cityを取得できるようにします。 city_masterのcity_nameからの名前..

これは、MySQLで必要なすべてのものです-ストアドプロシージャまたは関数のいずれかです。私はそれをc#.netで使用しています。

4

4 に答える 4

1

率直に言って、これは悪い設計のように思えます。整数値が個別に必要な場合は、それに応じてデータベース構造を変更し、最初に値を個別に保存します。

つまり、それがどこにつながるかがわかります-値をリストとして文字列に保存したため、テーブルに参加するたびに値を巻き戻す必要がある位置に移動しました。

それは荷馬車の後ろに馬を置くようなものです。

于 2009-12-30T07:18:24.280 に答える
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 に答える
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 に答える