2017-01-18 6 views
0

У меня есть 3 различных таблиц:Как присвоить одно значение из таблицы в нескольких из другого

process table: 
| projectNo | process | studio | 
+-----------+---------+--------+ 
| 170001 | ANM BLD | APEX | 
| 170001 | ANM BLD | CANVAS | 
| 170002 | CGI MOD | APEX | 
| 170003 | CGI MOD | ORBIT | 

proc_leader table: 
| projectNo | process | proc_leader| 
+-----------+---------+------------+ 
| 170001 | ANM BLD | John  | 
| 170001 | ANM BLD | James  | 
| 170002 | CGI MOD | Peter  | 
| 170003 | CGI MOD | Kate  | 

proc_checker table: 
| projectNo | process | proc_checker| 
+-----------+---------+------------+ 
| 170001 | ANM BLD | Aaron  | 
| 170001 | ANM BLD | John  | 
| 170002 | CGI MOD | Peter  | 
| 170003 | CGI MOD | Adel  | 

Так что я хочу сделать, это создать HTML таблицу выглядеть следующим образом:

| username | studio APEX | studio CANVAS | studio ORBIT | 
+----------+-------------+---------------+--------------+ 
| Aaron |  x  |  x  |    | 
| Adel  |    |    |  x  | 
| John  |  x  |  x  |    | 
| James |  x  |  x  |    | 
| Kate  |    |    |  x  | 
| Peter |  x  |    |    | 

Поэтому я хочу присвоить студию из таблицы процессов имени пользователя. Можно ли это сделать?

+0

Это просто присоединиться. Форматирование обычно выполняется в PHP – Strawberry

ответ

1

UNION таблица лидеров и контрольно-измерительных приборов и LEFT JOIN с таблицей process.

Попробуйте это:

select 
    p2.proc_leader, 
    case count(case when p1.studio = 'APEX' then 1 end) > 0 then 'x' end, 
    case count(case when p1.studio = 'CANVAS' then 1 end) > 0 then 'x' end, 
    case count(case when p1.studio = 'ORBIT' then 1 end) > 0 then 'x' end 
from process p1 
left join (
    select * 
    from proc_leader 
    union all 
    select * 
    from proc_checker 
) p2 on p1.projectNo = p2.projectNo 
and p1.process = p2.process 
group by p2.proc_leader; 
+0

Что делать, если будет больше студий? не только три. –

+0

Для динамического поворота и AFAIK MySQL не имеет встроенной поддержки для этого. Взгляните на этот процедурный метод, используя динамический SQL - http://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns – GurV

1

Я думаю, что следующий делает то, что вы хотите:

select proc_leader, 
     max(case when studio = 'APEX' then 'x' else '' end) as APEX, 
     max(case when studio = 'CANVAS' then 'x' else '' end) as CANVAS, 
     max(case when studio = 'ORBIT' then 'x' else '' end) as ORBIT 
from ((select l.proc_leader, p.studio 
     from proc_leader l join 
      process p 
      on l.projectNo = p.projectNo 
    ) union all 
     (select c.proc_leader, p.studio 
     from proc_checker c 
      process p 
      on c.projectNo = p.project_no 
    ) 
    ) pp 
group by proc_leader; 
+0

Что делать, если будет больше студий? Мне придется регулярно менять код, как этого избежать? –

+0

@YevgeniyBagackiy. , , Если вам нужно динамически сопоставлять все студии, вам нужен динамический SQL. Вы можете начать с googling «mysql dynamic pivot». –

1
SELECT 
    u.username, 
    max(if (p.studio = 'APEX', 'x', '')) AS APEX, 
    max(if (p.studio = 'CANVAS', 'x', '')) AS CANVAS, 
    max(if (p.studio = 'ORBIT', 'x', '')) AS ORBIT 
FROM (
    SELECT proc_leader AS username,projectNo FROM proc_leader 
    UNION 
    SELECT proc_checker AS username,projectNo FROM proc_checker 
) AS u 
LEFT JOIN process AS p ON p.projectNo = u.projectNo 
GROUP BY 1 

enter image description here

+0

Да, но проблема в том, что может быть более 3 студий, всего 13 студий, которые могут быть использованы пользователем, даже если я жестко запрограммировал каждый в запросе, есть еще возможность для пользователя создать новую студию. и после того, как пользователь сделает это, мне придется снова изменить запрос. Есть ли способ избежать этого? –

Смежные вопросы