有条件地选择联接表

时间:2015-06-15 17:31:06

标签: mysql left-join

我有三张桌子A,F,R

Table A
-----
id   | type   | user_id


Table F
-----
id   | Title


Table R
-----
id   | Title

在A中,有一列Type,其中只能包含值fr

现在我想有条件地选择并加入这三个表,如果A中的列值Typer,则将A中的行连接到R,如果列Type则连接从A到F的行A中的{是f

我试过

SELECT a.*,f.* FROM  `A` a
INNER JOIN F ON F.type= a.type AND a.type = 'f'
INNER JOIN R ON F.type= a.type AND a.type =  'r'

我得到空行

2 个答案:

答案 0 :(得分:1)

你很接近,但是需要更改为LEFT-JOIN并使用coalesce ...如果第一个值为null,则从另一个表中获取...但是你的样本结构并不真正匹配你没有表现出" TYPE" " F"中的列和" R"表。

SELECT 
      a.*,
      COALESCE( f.title, r.title ) as WhichTitle
   FROM  
      `A` a
         LEFT JOIN F 
            ON a.type = F.type
         LEFT JOIN R 
           ON a.type = R.type
   where
         a.type = 'f'
      or a.type = 'r'

然而,就是说,如果您还可以提供一些示例数据来显示每个表的上下文以及您期望的内容,那将会有所帮助。

答案 1 :(得分:1)

在f和r中输入更容易,否则你可以在连接之前添加它

DECLARE @a TABLE(id INT, type VARCHAR(1), user_id int)
DECLARE @f TABLE(id INT, title VARCHAR(2))
DECLARE @r TABLE(id INT, title VARCHAR(2))

INSERT INTO @a
SELECT 1,'r',1
UNION ALL
SELECT 2,'f',2

INSERT INTO @f
SELECT 1,'f1'
UNION ALL
SELECT 2,'f2'


INSERT INTO @r
SELECT 1,'r1'
UNION ALL
SELECT 2,'r2'

SELECT a.*,b.* 
FROM  @a a
INNER JOIN (
    SELECT *,'r' AS type FROM @r
    UNION ALL
    SELECT *,'f' AS type FROM @f
) AS B ON B.type = a.type