MySQL:如何多次加入同一个表?

MySQL:如何多次加入同一个表?,mysql,sql,group-by,left-join,Mysql,Sql,Group By,Left Join,我有两张桌子ticket和attr。表ticket包含ticketd\u id字段和几个其他字段。表attr有3个字段: ticket_id - numeric attr_type - numeric attr_val - string attr_type是一个固定的值枚举。例如,它可以是1、2或3 我需要做一个查询,结果是4列: ticket\u id,attr\u val用于attr\u type=1,attr\u val用于attr\u type=2,attr\u val用于attr\u

我有两张桌子
ticket
attr
。表
ticket
包含
ticketd\u id
字段和几个其他字段。表
attr
有3个字段:

ticket_id - numeric
attr_type - numeric
attr_val - string
attr_type
是一个固定的值枚举。例如,它可以是
1
2
3

我需要做一个查询,结果是4列:

ticket\u id
attr\u val
用于
attr\u type=1
attr\u val
用于
attr\u type=2
attr\u val
用于
attr\u type=3

如果
attr
表中的
attr\u type
没有相应的值,则相应列中应显示空值

例如:

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
表,但无法通过
attr\u type

使用表别名来安排输出

例如:


您需要使用多个
左联接

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

下面是一个示例:.

虽然您可以使用别名左连接,但在这种情况下,您也可以使用分组表达式和条件表达式的组合:

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

我在类似的问题中尝试了您的查询,但返回的是相同的记录。为什么呢?我错在哪里了?这对我来说最有效,因为我必须对我想离开的表进行内部连接。
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