2013-08-30 49 views
1

我有一个TABLE_A如何加入两个在条件对同一领域

| id | status1 | status2 | 
+------+---------+---------+ 
| 1 |  2 | 3 | 
+------+---------+---------+ 
| 2 |  1 | 3 | 
+------+---------+---------+ 

和表-B

| id | name | 
+------+---------+ 
| 1 | yep | 
+------+---------+ 
| 2 | nope | 
+------+---------+ 
| 3 | maybe | 
+------+---------+ 

我怎样才能输出到这个样子?

1 = nope,也许;
2 =是的,也许

我想是这样的:

SELECT * FROM table_A a 
LEFT JOIN table_B b 
ON a.status1= b.id AND a.status2= b.id" 

回答

2

你想要做两连接,一个为每个状态字段:

SELECT a.id, b1.name as name1, b2.name 
FROM table_A a LEFT JOIN 
    table_B b1 
    ON a.status1 = b1.id LEFT JOIN 
    table_B b2 
    on a.status2= b2.id; 

编辑:

用于娱乐的缘故,你可以用一个连接和聚合做到这一点:

select a.id, 
     max(case when a.status1 = b.id then b.name end) as name1, 
     max(case when a.status2 = b.id then b.name end) as name2 
from table_A a left join 
    table_B b 
    on b.id in (a.status1, a.status2) 
group by a.id; 

然而,这两个联接版本实际上是简单。

+0

我明白了。我认为这可以通过一个连接完成。谢谢! – InTry

2

你也可以做这样的:

SELECT * FROM table_A a 
LEFT JOIN table_B b ON a.status1= b.id 
LEFT JOIN table_B bTmp ON a.status2= bTmp.id 
+0

谢谢。我接受了戈登的回答,因为它是第一个。 – InTry

+0

好的没问题! 最好的问候:) –

2

如果您想要一列完全为yep, maybenope, maybe,则需要GROUP_CONCAT function

你可以逃脱一个连接,如果你的“非转动”你table_a,这就是我的回答子查询的作用:

SELECT 
    a.id, 
    GROUP_CONCAT(b.name ORDER BY b.name DESC) 
FROM (
    SELECT id, status1 AS stat_id FROM table_a 
    UNION SELECT id, status2 FROM table_a 
) a 
INNER JOIN table_b b ON a.stat_id = b.id 
GROUP BY a.id; 

ORDER BYGROUP_CONCAT确保yepmaybe之前nope在逗号分隔列表中的maybe之前。

+0

谢谢你的清楚解释。不,我不需要那样的输出,这只是理解它的例子。我接受戈登的回答,因为他速度更快;)。 – InTry

+0

不客气,不用担心 - 当所有的答案都能帮助接受最快的答案时:) –

0
select a.id, b1.name, b2.name from tableB as b1 
inner join TableA as a 
on b1.id = a.status1 
inner join TableB as b2 
on b2.id = a.status2