Создание условного оператора выбора SQL, который вставляет на основе счетчика в MYSQL - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь разработать выписку, которая подсчитывает размеры товара, и вставить базу выписки на основе суммы этого подсчета.

Например,

У меня есть рубашка с3 размера (S, M, L) Для достижения размера мне нужно будет вставить оператор SQL.Оператор вставки должен вставить в таблицу 2 позицию меню.

Table1

ID |  Product | Size
1      Shirt      S  
2      Shirt      M
3      Shirt      L

Table2

ID  |  Dropdown_menu_Position
1        0
2        1
3        2

Я знаю, что следующий запрос неверен, но я изо всех силс логикой позади этого.Любой гуру SQL может помочь решить или направить меня в правильном направлении?

INSERT INTO Table2
CASE
WHEN COUNT (SIZE) = 1 THEN
     SELECT NULL, '0' 
WHEN COUNT (SIZE) = 2 THEN
     SELECT NULL, '1' 
WHEN COUNT (SIZE) = 3 THEN
     SELECT NULL, '2' 
ELSE ''
END

Я новичок в создании оператора CASE, и, возможно, оператор IF сработает лучше, но я не знаю ни одного.

1 Ответ

0 голосов
/ 08 ноября 2018

Если вы используете 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
...