【问题标题】:MySQL: How do I join same table multiple times?MySQL:如何多次加入同一张表?
【发布时间】:2012-09-24 17:23:56
【问题描述】:

我有两张桌子ticketattr。表ticketticked_id 字段和其他几个字段。表attr 有3个字段:

ticket_id - numeric
attr_type - numeric
attr_val - string

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

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

ticket_id, attr_val 用于attr_type=1, attr_val 用于attr_type=2, attr_val 用于attr_type=3

如果attr表中没有attr_type的对应值,则对应列应显示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 安排输出

【问题讨论】:

    标签: mysql sql group-by left-join


    【解决方案1】:

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

    【讨论】:

    • 我在类似的问题中尝试了您的查询,但它返回相同的记录。这是为什么?我在哪里弄错了?
    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

      你使用表别名

      例如:

      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
      

      【讨论】:

      • 这对我来说效果最好,因为我必须在我想 LEFT JOIN 的表上进行 INNER JOIN。
      猜你喜欢
      • 1970-01-01
      • 2018-07-21
      • 2015-04-04
      • 2010-09-17
      • 1970-01-01
      • 2014-03-05
      相关资源
      最近更新 更多