Объединение таблиц с заданными данными - PullRequest
0 голосов
/ 27 января 2012

Я создаю базу данных для магазина.Есть 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 ]

2 голосов
/ 27 января 2012

Пример таблицы одежды

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 в таблицу, найти все предметы одежды одного типа, которые доступны в определенном размере и т. Д.

0 голосов
/ 27 января 2012

Вы можете использовать перекрестное соединение для всех строк, а затем выбрать внутри начального предложения SELECT, чтобы перечислить размеры в одном столбце.

0 голосов
/ 27 января 2012

Способ сделать это - использовать динамический 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, это зло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...