[英]MySQL: How do I join same table multiple times?
我有两张桌ticket
和attr
。 表ticket
有ticked_id
字段和其他几个字段。 Table 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
表中的attr_type
没有对应的值, 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
安排输出
您需要使用多个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小提琴 。
虽然您可以使用别名左连接,但在这种情况下,您还可以使用分组和条件表达式的组合:
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
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.