MySQL: Как я могу присоединиться к одной таблице несколько раз?

19

У меня есть две таблицы ticket и attr . Таблица ticket имеет поле ticked_id и несколько других полей. Таблица attr имеет 3 поля:

ticket_id - numeric
attr_type - numeric
attr_val - string

attr_type - фиксированное перечисление значений. Например, это может быть 1 , 2 или 3 .

Мне нужно сделать запрос, результатом которого будет 4 столбца:

ticket_id , attr_val для attr_type=1 , attr_val для attr_type=2 , attr_val для attr_type=3

Если нет соответствующего значения для attr_type в таблице attr , тогда значение NULL должно указываться в соответствующем столбце.

Пример:

ticket
    ticket_id: 1

    ticket_id: 2

    ticket_id: 3


attr
    ticket_id: 1
    attr_type: 1
    attr_val: Foo

    ticket_id: 1
    attr_type: 2
    attr_val: Bar

    ticket_id: 1
    attr_type: 3
    attr_val: Egg

    ticket_id: 2
    attr_type: 2
    attr_val: Spam

результат должен быть:

ticked_id: 1
attr_val1: Foo
attr_val2: Bar
attr_val3: Egg

ticked_id: 2
attr_val1: NULL
attr_val2: Spam
attr_val3: NULL

ticked_id: 3
attr_val1: NULL
attr_val2: NULL
attr_val3: NULL

Я пробовал левое соединение attr таблицы 3 раза, но не могу понять, как организовать вывод attr_type

    
задан rmflow 24.09.2012 в 10:56
источник

3 ответа

42

Вам нужно использовать несколько LEFT JOINs :

SELECT 
    ticket.ticket_id,  
    a1.attr_val AS attr_val1,
    a2.attr_val AS attr_val2,
    a3.attr_val AS attr_val3
FROM ticket
    LEFT JOIN attr a1 ON ticket.ticket_id=a1.ticket_id AND a1.attr_type=1
    LEFT JOIN attr a2 ON ticket.ticket_id=a2.ticket_id AND a2.attr_type=2
    LEFT JOIN attr a3 ON ticket.ticket_id=a3.ticket_id AND a3.attr_type=3

Вот пример: SQL Fiddle .

    
ответ дан András Ottó 24.09.2012 в 11:15
источник
7

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

select t.ticket_id,
       max(case when a.attr_type=1 then a.attr_val end) attr_val1,
       max(case when a.attr_type=2 then a.attr_val end) attr_val2,
       max(case when a.attr_type=3 then a.attr_val end) attr_val3
from ticket t
left join attr a on t.ticket_id = a.ticket_id
group by t.ticket_id
    
ответ дан Mark Bannister 24.09.2012 в 11:23
источник
2

Вы используете псевдонимы таблиц

, например:

Select 
    ticket.ticket_id,  
    a1.attr_val as attr_val1,
    a2.attr_val as attr_val2,
    a3.attr_val as attr_val3
from ticket
    left join (select * from attr where attr_type=1) a1 on ticket.ticket_id=a1.ticket_id
    left join (select * from attr where attr_type=2) a2 on ticket.ticket_id=a2.ticket_id
    left join (select * from attr where attr_type=3) a3 on ticket.ticket_id=a3.ticket_id
    
ответ дан podiluska 24.09.2012 в 10:58
источник