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

时间:2012-09-24 08:56:49

标签: mysql sql group-by left-join

我有两张表ticketattr。表格ticket包含ticked_id字段和其他几个字段。表attr有3个字段:

ticket_id - numeric
attr_type - numeric
attr_val - string

attr_type是一个固定的值枚举。例如,它可以是123

我需要进行查询,其结果将是4列:

ticket_idattr_valattr_type=1attr_valattr_type=2attr_valattr_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安排输出

3 个答案:

答案 0 :(得分:48)

您需要使用多个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

答案 1 :(得分:8)

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

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

答案 2 :(得分:5)

您使用表别名

例如:

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