2014-06-10 5 views
2

웹 사이트에 게시 된 마지막 코멘트가 들어있는 테이블이 있는데, 코멘트 type에 따라 다른 테이블에 가입하고 싶습니다. 내가하고 싶은 무엇MySQL은 필드 값을 기반으로 다른 테이블을 결합합니다.

id | type | ressource_id | 
---+------+--------------+ 
1 | 1 |  10  | 
2 | 3 |  7  | 

이 경우 유형 type = 1 (on news.id = comments.ressource_id), "튜토리얼"테이블 경우 유형 type = 3 등을 "뉴스"테이블에 가입하는 것입니다

Comments 표는이 구조와 유사하다 .

어떻게하면됩니까? CASEUNION을 사용하여 다른 쿼리를 시도했지만 예상 결과를 얻지 못했습니다.

감사합니다.

답변

2

typeleft outer joinon 절 일치를 사용해보십시오 :

select coalesce(n.id, t.id) id 
,  c.type 
,  c.resource_id 
from comments c 
left 
outer 
join news n 
on  n.id = comments.resource_id 
and c.type = 1 
left 
outer 
join tutorial t 
on  t.id = comments.resource_id 
and c.type = 3 
+0

덕분에 많이 귀하의 신속한 답변을 위해, 그것은 마법처럼 작동합니다! 나는 또한 이전에 '합치다'로 무언가를 시도했지만, 'OUTER JOIN'을 잊어 버렸으니 이제는 의미가있다. – SuN

+0

감사의 말씀을 전하기 위해 여기에 와서 인터넷 검색을 한 결과이 ID를 기반으로 데이터를 변경해야한다는 것을 알게되었습니다. :) – NaughtySquid

1

당신은 UNION을 쿼리 당신이의 라인을 따라, 유사한 스키마를 생산에 부분 쿼리를 강제 할 수 있다고 가정하여이 작업을 수행 할 수 있습니다 즉

select n.id as id, c.something as something 
    from news n, comments c 
    where n.type = 1 
    and n.id = c.resource_id 
union all 
select n.id as id, t.something as something 
    from news n, tutorial t 
    where n.type = 3 
    and n.id = t.resource_id 

, 첫 번째 쿼리는 단순히 행에 대한 newscomments 합류 여기서 news.type은 설명을 나타내고 두 번째 쿼리는 news.type이 자습서를 나타내는 행에 대해 newstutorials을 조인합니다.

그런 다음 공용체는 두 레코드를 단일 레코드 세트로 결합합니다.

이 상황 (및 많은 다른 것들)에서는 거의 항상 변하지 않는 데이터의 행 수정이 거의 필요하지 않기 때문에 나는 case을 벗어날 것입니다. 일반적으로 두 개의 쿼리를 실행하고 결과를 결합하는 것이 더 효율적입니다.

관련 문제