使用设置数据连接表

时间:2012-01-27 10:29:36

标签: mysql sql database database-design

我正在为商店构建底层数据库。有2个表,一个用于服装,另一个用于标准尺寸图表。服装有一种或多种尺码,尺码表包含每种尺码服装的几种尺寸。

示例尺寸图表

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

我遇到的问题是如何加入,以便我得到集合中的每个数字(available_size)都有一个相应的测量条目....

关于我如何做到这一点的任何想法/建议/建议都非常有用!

感谢。

3 个答案:

答案 0 :(得分: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

是万恶之源 - 所以,跟我说话:

如果我想单独访问它们,我将永远不会在单个数据库字段中存储多个信息。从不。

更严重的是,您希望从available_sizes表中删除garments字段,而是执行类似

的操作
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,搜索所有相同类型的服装,这些服装有特定尺寸等等。

答案 1 :(得分:0)

一种方法是使用动态SQL。从记忆中,它将是这样的东西:

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所说,这是邪恶的!

答案 2 :(得分:0)

您可以对所有行使用cross join,然后在内部选择初始SELECT子句,以在一列中列出大小。