Mysql, когда тогда и временная переменная. Объяснение

#mysql #sql

#mysql #sql

Вопрос:

У меня есть этот sql-запрос, который я пытаюсь понять. Могу ли я получить построчное объяснение, пожалуйста. Я знаю, что первая строка инициализирует переменную. Во второй строке задается минимальное значение.

 set @r1=0, @r2=0, @r3=0, @r4=0;
select min(Doctor), min(Professor), min(Singer), min(Actor)
from(
  select case when Occupation='Doctor' then (@r1:=@r1 1)
            when Occupation='Professor' then (@r2:=@r2 1)
            when Occupation='Singer' then (@r3:=@r3 1)
            when Occupation='Actor' then (@r4:=@r4 1) end as RowNumber,
    case when Occupation='Doctor' then Name end as Doctor,
    case when Occupation='Professor' then Name end as Professor,
    case when Occupation='Singer' then Name end as Singer,
    case when Occupation='Actor' then Name end as Actor
  from OCCUPATIONS
  order by Name
) Temp
group by RowNumber
  

Ответ №1:

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

Он выполняет эквивалент:

 select max(case when occupation = 'Doctor' then name end) as doctor,
       max(case when occupation = 'Professor' then name end) as professor,
       max(case when occupation = 'Singer' then name end) as singer,
       max(case when occupation = 'Actor' then name end) as actor       
from (select o.*,
             row_number() over (partition by occupation order by name) as seqnum
      from occupations o
     ) o
group by seqnum;
  

Это лучший способ написать запрос в MySQL 8 , потому что такое использование переменных устарело. Что он делает, так это помещает занятия в отдельные столбцы:

 occupation     name
doctor         A
doctor         B
singer         C
  

Превращается в:

 doctor    professor    singer     actor
  A                      C
  B
  

Промежуточный шаг — это:

 occupation     name     seqnum
doctor         A           1
doctor         B           2
singer         C           1
  

Комментарии:

1. что делает Temp перед последней строкой. Также не могли бы вы объяснить, что (затем название end) Я буду признателен, если вы сможете подробнее объяснить свой запрос или направить меня к некоторым документам.

2. @FrankDax . . . Это псевдоним таблицы.

3. Также не могли бы вы объяснить, что (затем название end) Я буду признателен, если вы сможете подробнее объяснить свой запрос или направить меня к некоторым документам

4. @FrankDax . . case выражения являются базовой частью языка SQL и рассматриваются в любой документации: dev.mysql.com/doc/refman/8.0/en/case.html .