Если вы используете MySQL 8.0, вы можете использовать для этого оконные функции. Их можно использовать для генерации нумерации по группе:
insert into Table2(Id, Dropdown_menu_Position)
select
t.ID,
--t.Product,
--t.Size,
ROW_NUMBER() over (
order by s.SortOrder
) partition by (t.Product) as Dropdown_menu_Position
from
Table1 t
inner join (
-- Inlined now, but maybe you can make a lookup table for this
select 'XS' as Size, 0 as SortOrder
union all select 'S', 1
union all select 'M', 2
union all select 'L', 3
union all select 'XL', 4
union all select 'XXL', 5
) s on s.Size = t.Size
В более ранних версиях MySQL этих функций не существует, и это не будет работать. Однако для этого конкретного случая вы действительно должны иметь возможность использовать count
для проверки количества строк перед текущей. Если у вас есть отдельная таблица для размеров, этот запрос вполне читабелен, но если нет, вам придется встраивать таблицу поиска в запрос дважды. Образец ниже предполагает отдельную таблицу:
-- Assuming a lookup table like this:
create table Sizes as
select 'XS' as Size, 0 as SortOrder
union all select 'S', 1
union all select 'M', 2
union all select 'L', 3
union all select 'XL', 4
union all select 'XXL', 5;
-- Select all IDs and how often a smaller size exists for that product
insert into Table2(Id, Dropdown_menu_Position)
select
t.ID,
( select count(*)
from
Table1 t2
inner join Sizes s2 on s2.Size = t2.Size
where
t2.Product = t.Product and
s2.SortOrder < s.SortOrder) as Dropdown_menu_Position
from
Table1 t
inner join Sizes s on s on s.Size = t.Size
Но, возможно, вам не нужны числа в Таблице 2, чтобы быть последовательными. Может быть, все в порядке, если они имеют правильный порядок (поэтому M ниже S в меню). Это, конечно, будет зависеть от вашего кода, но если это возможно, вы можете просто написать это:
insert into Table2(Id, Dropdown_menu_Position)
select
t.ID,
s.SortOrder
from
Table1 t
inner join (
-- Inlined now, but maybe you can make a lookup table for this
select 'XS' as Size, 0 as SortOrder
union all select 'S', 1
union all select 'M', 2
union all select 'L', 3
union all select 'XL', 4
union all select 'XXL', 5
) s on s.Size = t.Size