2012-04-26 2 views
1

저는 지적 재산 관리 시스템에서 데이터베이스에 2 개의 테이블을 가지고 있습니다 - 상표 및 디자인.JOIN의 MySQL 조건부 테이블 이름

그렇다면 야당과 같은 것이 있습니다. 즉, 누군가 다른 사람이 상표 또는 디자인을 가지고 있다면, 우리의 고객 인 것처럼 보입니다. 관리자는 새로운 야당을 창출 할 수 있습니다.

상표 :

id 
name 

디자인 :

id 
name 

oppostion :

id 
name 
object_id 
object_table 

모르겠어요에

예를 들어

, 나는 3 개 테이블이 어떤 대립 이냐? 테드,하지만 난 쿼리 같은 종류 할 가능성이 있어야합니다

SELECT id, name, opposition_object.name FROM opposition 
LEFT JOIN (trademark|design) as opposition_object on opposition.object_id = (trademark|design).id 

첫째, 나는 야당 테이블의 object_table 컬럼으로 테이블 이름을 저장하는 생각,하지만 난 그게 될 것입니다 경우 모르겠어요 실현 가능한 테이블 이름을 쿼리 할 수 ​​있으며, 무엇보다 중요한 것은 잘못된 디자인입니다.

그러나 나는 여기에 맞았고 아무 것도 내 마음에 온다. 그래서 누구든지 그것을 어떻게 처리 할 수있는 아이디어가 있습니까? trademark 테이블에 합류 하나 하나가 design 가입 :

답변

3

아마 뭔가 :

SELECT 
    id, 
    name, 
    COALESCE(trademark.name,design.name) AS object_name 
FROM 
    opposition 
    LEFT JOIN trademark 
     on opposition.object_id = trademark.id 
     AND trademark.object_table ='trademark' 
    LEFT JOIN design 
     on opposition.object_id = design.id 
     AND design.object_table ='design' 
+0

감사합니다, 이것이 정확히 내가 무엇을 찾고 있었다! –

+0

@KuH 또한 내 대답의 쿼리와 성능을 비교하십시오. 완전히 확신 할 수는 없지만 동일한 쿼리 결과를 반환하는 쿼리가 빨라야한다고 생각합니다. –

+1

@KuH : 문제 없습니다. 생각하는 대답에 대해 찬성표를 던지십시오. 그것은 우리에게 따뜻한 솜털 같은 느낌을줍니다 : P. – Arion

0
SELECT opposition.id, opposition.name, trademark.name AS object_name 
FROM opposition 
LEFT JOIN trademark 
    ON opposition.object_id = trademark.id 
WHERE opposition.object_table = 'trademark' 

UNION 

SELECT opposition.id, opposition.name, design.name AS object_name 
FROM opposition 
LEFT JOIN design 
    ON opposition.object_id = design.id 
WHERE opposition.object_table = 'design' 

이 두 쿼리를 발행합니다. 그런 다음 결과는 UNION을 사용하여 하나의 결과 집합으로 통일됩니다. 이 같은