2012-08-25 2 views
2

저는 포럼에서 일하고 있으며, 모든 포럼과 마찬가지로 스레드와 응답이 있습니다.SQL에서 동적 if 문을 수행하는 방법은 무엇입니까?

post 
------------ 
id 
user_id 
time 
type 
effective_id 

thread 
------------ 
id 
update_time 
text 
response_number 
deleted 

response 
------------ 
id 
container_id 
text 
deleted 

post.typeenum('thread', 'response')이며, post.effective_idpost.type가 표시 무엇에 따라 thread.id 또는 response.id 일치해야합니다 : 이들은 내가 그들을 저장하는 데이터베이스에서 사용하는 테이블입니다.

여러분도 알다시피, 나는 스레드와 응답이 공통으로 가지고있는 모든 것을 분해하고 있습니다. 여기


내가 직면 한 문제입니다 : 나는 주어진 게시물 삭제 여부를 결정하려는 포스트 테이블에 deleted 필드를 이동하지 않고 단일 쿼리(이 정보로 id의 필요) .

주어진 id가 스레드 또는 응답에 속하는지 미리 알고있는 경우 사용할 쿼리입니다.

SELECT thread.deleted 
FROM post INNER JOIN thread ON post.effective_id = thread.id 

또는

SELECT response.deleted 
FROM post INNER JOIN response ON post.effective_id = response.id 

하지만, "if the post.type is thread then INNER JOIN with thread and get the deleted field, if post.type is response then INNER JOIN with response and get the delete field."SQL에서 어떻게 말할 수 있습니까? 어떤 종류의 동적 인 "if"가 필요할 것입니다.

지정한 조건에서이 작업을 수행 할 수 있습니까?

감사합니다.

답변

2

는 아래 쿼리의 경우에서 살펴 보자 :

SELECT CASE 
WHEN post.type = 'thread' THEN thread.deleted 
WHEN post.type = 'response' THEN response.deleted 
ELSE 'default' 
END 
FROM post 
LEFT JOIN thread ON post.effective_id = thread.id 
LEFT JOIN response ON post.effective_id = response.id 
+0

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

1

사용이 왼쪽 조인 :

SELECT IFNULL(thread.deleted, response.deleted) AS deleted 
FROM post 
LEFT JOIN thread ON post.effective_id = thread.id 
AND post.type = 'thread' 
LEFT JOIN response ON post.effective_id = response.id 
AND post.type = 'response' 
관련 문제