2012-09-03 33 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