сбивает с толку MySqL JOIN - PullRequest
0 голосов
/ 15 мая 2018

К сожалению, я не уверен, есть ли конкретное имя для запроса, который я пытаюсь написать.Моя проблема заключается в следующем: я создал две временные таблицы, одну со списком клиентов, которые «отказались» от общения, либо в IVR, либо по электронной почте.

mysql> desc tt_customers;
+------------------+------------------+------+-----+---------+-------+
| Field            | Type             | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| id               | int(10) unsigned | NO   | MUL | 0       |       |
| name             | varchar(40)      | NO   |     | NULL    |       |
+------------------+------------------+------+-----+---------+-------+

mysql> desc tt_opt_outs;
+-----------------------+----------------------------------------+------+-----+---------+-------+
| Field                 | Type                                   | Null | Key | Default | Extra |
+-----------------------+----------------------------------------+------+-----+---------+-------+
| customer_id           | int(10) unsigned                       | NO   | MUL | NULL    |       |
| event_type            | enum('PRE_PEAK_TIME','POST_PEAK_TIME'  | YES  |     | NULL    |       |
| notification_channel  | enum('EMAIL','IVR')                    | NO   |     | NULL    |       |
+-----------------------+----------------------------------------+------+-----+---------+-------+

Не все клиенты в таблице клиентов будут включены в таблицу отказа.Клиенты в таблице отказа могут быть там с отказом от EMAIL, IVR или обоих, и для любого типа события.Я хотел бы создать отчет со следующими заголовками столбцов customer_id, name, IVR Optout, Email Optout, где столбцы IVR и Email откажутся независимо от отказа event_type.Я не уверен, как структурировать соединение / подзапрос / объединение или что-то еще, что мне нужно здесь, чтобы создать точный запрос, который мне нужен.Любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Помимо оператора case вы также можете использовать левое внешнее соединение.

Запрос (левое внешнее соединение)

 select c.id as customer_id , c.name,ti.notification_channel as IVR,
    te.notification_channel as EMAIL from tt_customers c
    left outer join tt_opt_outs ti on c.id = ti.customer_id and ti.notification_channel = 'IVR' 
   left outer join tt_opt_outs te on c.id = te.customer_id and te.notification_channel = 'EMAIL'

Вывод:

enter image description here

Настройка данных:

create table tt_customers (id int(10), name varchar(40));
create table tt_opt_outs (customer_id int(10), event_type enum('PRE_PEAK_TIME','POST_PEAK_TIME'), notification_channel enum('EMAIL','IVR') );
insert into tt_customers values (1,"all in");
insert into tt_customers values(2,"email out");
insert into tt_customers values(3,"ivr out");
insert into tt_customers values(4,"all out");
insert into tt_opt_outs values(2,'PRE_PEAK_TIME','EMAIL');
insert into tt_opt_outs values(3,'PRE_PEAK_TIME','IVR');
insert into tt_opt_outs values(4,'PRE_PEAK_TIME','EMAIL');
insert into tt_opt_outs values(4,'PRE_PEAK_TIME','IVR');

Скрипка SQL: http://sqlfiddle.com/#!9/0e82a7/17

0 голосов
/ 15 мая 2018

Ниже приведен SQL, который даст вам желаемый результат:

create table tt_customers(id int,name varchar(40));
create table tt_opt_outs(customer_id int,event_type enum('PRE_PEAK_TIME','POST_PEAK_TIME'),notification_channel enum('EMAIL','IVR'));

insert into tt_customers values(1,'ABC');
insert into tt_customers values(2,'XYZ');
insert into tt_opt_outs values(1,'PRE_PEAK_TIME','EMAIL');
insert into tt_opt_outs values(2,'POST_PEAK_TIME','IVR');

Ваш запрос для желаемого результата:

select c.id as customer_id,
    c.name,
    case when t.notification_channel = 'IVR' then 'Yes' else null end ivr_optout,
    case when t.notification_channel = 'EMAIL' then 'Yes' else null end email_optout
from tt_customers c
   left join tt_opt_outs t
   on (c.id = t.customer_id);
...