2011-02-23 9 views
0
select id, ips from users; 

クエリ結果はどのようにMySQLでは複数の行にカンマで区切られたフィールドを展開し

id ips 
1  1.2.3.4,5.6.7.8 
2  10.20.30.40 
3  111.222.111.222,11.22.33.44 
4  1.2.53.43 

これが来た

user_id  ip 
1   1.2.3.4 
1   5.6.7.8 
2   10.20.30.40 
3   111.222.111.222 
3   11.22.33.44 
4   1.2.53.43 
+0

私は一時テーブルとストアドプロシージャを扱うようにあなたを願っています。何かは、このデータベースを正規化する必要があると私に伝えます。 –

+0

可能であれば、dbのこの部分を正規化するように再設計します。 user_idからipへの1:nの関係は、それ自身のテーブルに格納する必要があります。 –

+0

@ブラッドクリスティ、データベースは通常okです。これは、私が直面してきた一回限りの正規化問題のようなものです。 –

答えて

1

は、私は、これは、クエリを使用してやりたいものだとは思わないが、あなたはむしろあなたのプレゼンテーションロジックでこれを行うと思います。データベースは、データの格納と検索のためのものです。データの書式設定とプレゼンテーションは、プレゼンテーション層で行うべきことです。通常はPHP/ASP.NET /その他のものと組み合わせます。

2

カーソルを使用して気にしない場合は、ここでは例です:


set nocount on; 
-- create sample table, @T 
declare @T table(id int, ips varchar(128)); 
insert @T values(1,'1.2.3.4,5.6.7.8') 
insert @T values(2,'10.20.30.40') 
insert @T values(3,'111.222.111.222,11.22.33.44') 
insert @T values(4,'1.2.53.43') 
insert @T values(5,'1.122.53.43,1.9.89.173,2.2.2.1') 

select * from @T 

-- create a table for the output, @U 
declare @U table(id int, ips varchar(128)); 

-- setup a cursor 
declare XC cursor fast_forward for select id, ips from @T 
declare @ID int, @IPS varchar(128); 

open XC 
fetch next from XC into @ID, @IPS 
while @@fetch_status = 0 
begin 
     -- split apart the ips, insert records into table @U 
     declare @ix int; 
     set @ix = 1; 
     while (charindex(',',@IPS)>0) 
     begin 
      insert Into @U select @ID, ltrim(rtrim(Substring(@IPS,1,Charindex(',',@IPS)-1))) 
      set @IPS = Substring(@IPS,Charindex(',',@IPS)+1,len(@IPS)) 
      set @ix = @ix + 1 
     end 
     insert Into @U select @ID, @IPS 

    fetch next from XC into @ID, @IPS 
end 

select * from @U 
関連する問題