2012-01-27 59 views
0

我正在建立店鋪的底層數據庫。有兩張桌子,一張用於服裝,另一張用於放置標準尺寸的圖表。服裝有一種或多種尺寸,尺碼錶包含各種尺寸服裝的幾種尺寸。加入設定數據的表格

例尺寸圖表

id size waist chest hips height 
0 6  56  76  82  160 
0 8  60  80  86  162 
0 10  64  84  90  164 
0 12  68  88  94  166 
1 6  57  75  82  160 
1 8  61  79  86  162 
1 10  62  83  90  164 
1 12  63  87  94  166 

例服裝表

garment_id garment_name garment_type size_chart available_sizes 
0   Boating Jacket jacket   0   8,10,12  
1   Polka Dot Skirt skirt   1   10,12 

我想要做的就是加入他們的行列,讓我有

garment_id ... size_chart available_sizes size_chart.id size_chart.size  size_chart.(...) 
    0   ... 0   8,10,12  0     8 
    0   ... 0   8,10,12  0     10 
    0   ... 0   8,10,12  0     12 
    1   ... 1   10,12  1     10 
    1   ... 1   10,12  1     12 

我遇到的問題如何加入,這樣我就可以獲得set(available_size)中的每個數字都有一個相應的測量條目rements ....

任何想法/建議/建議如何我最好這樣做會非常有用!

謝謝。

+0

謝謝大家誰回覆!我最終與@Eugen Rick一起回答了這個問題,因爲它接近一個最好的方式來做到這一點,並允許我實際上沒有察覺到的更多功能。感謝所有人發帖,都非常有幫助。 – 2012-01-31 11:04:54

回答

2

例服裝表

garment_id garment_name garment_type size_chart available_sizes 
0   Boating Jacket jacket   0   8,10,12  
1   Polka Dot Skirt skirt   1   10,12 

是一切罪惡的根源 - 所以,在我講:

我永遠不會存儲多於一個的信息在一個單一的數據庫字段,如果我想單獨訪問它們。決不。

在一個更嚴重的是,你會想從garments表中刪除available_sizes領域,而不是像做

CREATE TABLE available_sizes (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    garment_id INT NOT NULL, 
    INDEX(garment_id), 
    size_id INT NOT NULL, 
    INDEX(size_id) 
) 

和填充它。這可以很容易地將一個尺碼標爲已售罄,甚至可以在表中添加qty_in_stock INT,搜索相同類型的所有服裝,這些服裝可以是特定的尺寸等。

+0

哈哈!好的,所以我應該製作一個單獨的行,併爲每個行設置複合主鍵,標識id和大小。猜猜我可以將實際的服裝信息(顏色名稱等)分散到另一個表中以避免重複。 – 2012-01-27 10:35:08

+0

查看我的編輯。我不確定顏色(我不是時尚人士) - 如果你只是有「紅色」這可能是一個想法,但如果你有「木星紅」,「火紅」,「櫻紅」 ,「foo-red」aso你可能只想將它們存儲爲文本。 – 2012-01-27 10:39:21

+0

永不言敗。我一直聽到的一般規則是,首先進行標準化,然後在必要時優化(速度)。 – bnieland 2012-01-27 10:40:21

0

一種方法是使用動態SQL。從內存中,這將是simething這樣的:

declare @cmd varchar(1000) 

declare @id int 
select @id = 0 

declare @inVariable varchar(20) 
select @inVariable = NULL 

while(true) 
begin 
    select @inVariable = availables_sizes from garment where id = @id 

    if (@inVariable <> NULL OR @inVariable <> '') 
    begin 

     if(@id > 0) 
     begin 
      select @cmd = 
      ' UNION select g.garment_id, g.size_chart, g.availables_sizes, c.id, c.size 
      from garments g 
      inner join chart c on g.size_chart = c.id 
        and c.id = ' + convert(varchar, @id) + ' 
        and c.size in (' + @invariable + ')' 
     end 
     else 
     begin 
      select @cmd = 
      'select g.garment_id, g.size_chart, g.availables_sizes, c.id, c.size 
      from garments g 
      inner join chart c on g.size_chart = c.id 
        and c.id = ' + convert(varchar, @id) + ' 
        and c.size in (' + @invariable + ')' 
     end 

     select @id = @id + 1 
    end 
    else 
    begin 
     break 
    end 
end 

exec(@cmd) 

現在,像@EugenRieck說,這是邪惡的!

0

您可以對所有行使用cross join,然後在的子選中使用初始SELECT子句來列出一列中的大小。

+0

好的,謝謝。我也會看看這個。 – 2012-01-27 11:01:40