Как отключить следующую таблицу в Mysql?[Запрос на лучший подход] - PullRequest
0 голосов
/ 29 декабря 2018

Исходная таблица:

customer_id |заказ_А |order_B |order_C |order_D

       1 |       1 |       0 |       0 |       1 |
       2 |       0 |       1 |       0 |       1 |
       3 |       1 |       1 |       0 |       1 |
       4 |       0 |       0 |       0 |       1 |

Требуемый вывод:

customer_id |order_type |

       1 | A          |
       1 | D          |
       2 | B          |
       2 | D          |
       3 | A          |
       3 | B          |
       3 | D          |
       4 | D          |

Первоначально мой вопрос был помечен как дубликат, и меня попросили указать следующий вопрос: Сводная таблица MySQL

Я сослался на него и также взялпомогите http://archive.oreilly.com/oreillyschool/courses/dba1/ придумать следующий код:

select customer_id,
 case when order_A=1 then 'A' end as order_type
 from tb1 having order_type is not null
Union all
 select customer_id,
 case when order_B=1 then 'B' end as order_type
 from tb1 having order_type is not null
Union all
 select customer_id,
 case when order_C=1 then 'C' end as order_type
 from tb1 having order_type is not null
Union all
 select customer_id,
 case when order_D=1 then 'D' end as order_type
 from tb1 having order_type is not null order by customer_id,order_type;

Этот код действительно дает мне требуемый вывод, но мне было интересно, есть ли лучший способ / подход к этому вопросу.

Кроме того, было бы очень полезно, если бы кто-то мог помочь предложить веб-сайт / книги, где я могу практиковать такой вопрос для интервью.

1 Ответ

0 голосов
/ 29 декабря 2018

Я бы написал это следующим образом:

select customerId, 'A' as order_type
from tb1
where order_A = 1
union all
select customerId, 'B' as order_type
from tb1
where order_B = 1
union all
select customerId, 'C' as order_type
from tb1
where order_C = 1
union all
select customerId, 'D' as order_type
from tb1
where order_D = 1;

Условная логика заключена в where, а не разделена между выражением case и предложением having.При этом также используется стандартный SQL, он будет работать в любой базе данных (использование having без GROUP BY не является расширением MySQL).

Если вы хотите упростить запрос из производительности перспектива, то вы хотите исключить четыре скана.Вы можете сделать:

select tb1.customerId, o.order_type
from tb1 join
     (select 'A' as order_type union all
      select 'B' as order_type union all
      select 'C' as order_type union all
      select 'D' as order_type 
     ) o
     on (tb1.order_A = 1 and o.order_type = 'A') or
        (tb1.order_B = 1 and o.order_type = 'B') or
        (tb1.order_C = 1 and o.order_type = 'C') or
        (tb1.order_D = 1 and o.order_type = 'D') ;

Это должно прочитать строку из tb1 и затем выполнить четыре сравнения с помощью операции join.Подход union all читает таблицу четыре раза.

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