2012-09-03 3 views
3

'Links'테이블에 대한 쿼리의 반환 된 결과에서 행당 'toTable'값에 조건부 JOIN에서 선택된 'DisplayName'값을 나타내는 추가 열을 추가하려고합니다. 또한 때때로 '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'또는 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 다른 열이있는 테이블 :

(210)
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을 반환한다. [from http://dev.mysql.com/](http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce) – johowie

관련 문제