2012-09-03 36 views
3

在对“链接”表的查询返回的结果中,我还想添加一个额外的列,该列显示从'012表'中选择的'DisplayName'值,条件是每行'toTable'的值。另外有时候,'DisplayName'值是串联的结果。如何有条件地选择基于每行的表和列?

我的问题是我该如何做到这一点?

我可以写单独的查询,并与UNION ALL结合起来,虽然我不知道是否有做

条件的方式在“链接”表中的每个条目描述了在两个表中一对条目之间的联系(的可能的3个或更多表格)。

表链接:

| LinkID | fromTable | fromID | toTable | toID | 
|  1 |  A |  1 |  B | 1 | 
|  2 |  A |  1 |  C | 2 | 
|  3 |  B |  1 |  C | 1 | 
|  4 |  C |  1 |  A | 1 | 

的查询结果,我想: WHERE Links.fromTable = 'A' OR Links.fromTable =例如 'C'

| LinkID | fromTable | fromID | toTable | toID | DisplayName  | 
|  1 |  A |  1 |  B | 1 | Some Title  | 
|  2 |  A |  1 |  C | 2 | Loud-Quack  | 
|  4 |  C |  1 |  A | 1 | Linus   | 

3不同色谱柱的表格:

Table A:  
| ID | Name | 
| 1 | Linus | 

-

Table B:  
| ID | Title  | 
| 1 | some title | 

-

Table C:  
| ID | CategoryA | CategoryB | 
| 1 | Bark | Softly | 
| 2 | Quack | Loud | 

- 这是我正在做这将UNION ALL这是不是很灵活: 编辑:其实我觉得下面是错误的,我我现在看这个:

SELECT Links.*, A.Name AS DisplayName 
FROM Links 
JOIN A ON Links.toID = A.ID 
WHERE Links.fromType IN ('A') AND Links.toType IN ('B') 

UNION ALL 

SELECT Links.*, CONCAT(C.CategoryB,'-',C.CategoryA) AS DisplayName 
FROM Links 
JOIN C ON Links.toID = C.ID 
WHERE Links.fromType IN ('A') AND Links.toType IN ('C') 

回答

4

我瘦你需要inline CASE声明

SELECT a.*, 
     CASE toTable 
      WHEN 'A' THEN b.Name 
      WHEN 'B' THEN c.Title 
      WHEN 'C' THEN CONCAT(d.CategoryB , '-',d.CategoryA) 
     END AS DisplayName 
FROM `links` a 
      LEFT JOIN tableA b 
       ON a.toID = b.ID 
      LEFT JOIN tableB c 
       ON a.toID = c.ID 
      LEFT JOIN tableC d 
       ON a.toID = d.ID 
WHERE fromtable IN ('A', 'C') 

SQLFiddle Demo

+0

我已经用我的实际用例,它很有魅力。 – johowie

+0

@johowie我使用了'left join',所以如果这三个表中不存在'ID',它将仍然存在,但在'displayname'列上具有'NULL'值。为了格式化它,你可以使用'COALESCE'。 –

+0

如果一个链接重复,这将返回这两个链接?换句话说,如果fromType,fromID,toType,toID在Links表的两行中是相同的?在我的实际链接表中还有其他列,包括'linkType'列。两个项目可能会链接两次不同的linkTypes。 – johowie

1

那么,w第i您的示例查询,你可以这样做,而不是:

SELECT Links.*, COALESCE(A.Name,CONCAT(C.CategoryB,'-',C.CategoryA)) AS DisplayName 
FROM Links 
LEFT OUTER JOIN A ON Links.toID = A.ID 
    AND Links.fromType IN ('A') AND Links.toType IN ('B') 
LEFT OUTER JOIN C ON Links.toID = C.ID 
    AND Links.fromType IN ('A') AND Links.toType IN ('C') 

这个工作,只要你将永远从连接表获取最多一场比赛(也就是你没有这两个不同加入与相同的Links.fromType IN ...Links.toType IN ...标准)。

+0

想着它,我认为在重复的链接有可能我的实际使用情况后。否则这个答案是一个不错的选择。我必须查找'COALESCE':返回列表中的第一个非NULL值,如果没有非NULL值,则返回NULL。 [来自http://dev.mysql.com/](http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce) – johowie