2011-11-07 12 views
2

トリッキーなビット。IF /ケースで内部結合フィールドを選択する方法は?

一部のデータを整理していますが、データのサイズのためにかなり時間がかかるため、アップグレードが実行されている間にアプリを実行する必要があります。だから私はコメントテーブルと写真テーブルを持っています。各コメントレコードはに保存されているphoto_d_idをOBJECT_IDたか、またはに保存されているphoto_idをOBJECT_ID:私は、内側に必要

if comment_type = 8 then object_id = photo.photo_p_id 
if comment_type = 17 then object_id = photo.photo_id 

は、クエリの際、写真付きのテーブルを結合するが、上のinnerjoinを実行する必要がありますcomment_typeに基づくフォトテーブルの正しいフィールド。これは可能ではありませんが、私がしたいことの例を示しています:

select *.comments,*.photos 
FROM comments 
CASE 
    when comments.comment_type = 8 then inner join photos on comments.object_id = photo.photo_p_id 
    when comments.comment_type = 17 then inner join photos on comments.object_id = photo.photo_id 

アイデアはありますか?

答えて

2

を編集した)この文字列で検索してください -

SELECT c.*, 
    CASE c.comment_type WHEN 8 THEN p1.photo_p_id WHEN 17 THEN p2.photo_id ELSE NULL END photo_id, 
    CASE c.comment_type WHEN 8 THEN p1.column1 WHEN 17 THEN p2.column1 ELSE NULL END column1 
FROM comments c 
    LEFT JOIN photos p1 
    ON c.object_id = p1.photo_p_id 
    LEFT JOIN photos p2 
    ON c.object_id = p2.photo_id 

つ以上の変異体 -

SELECT c.*, p.* 
FROM comments c 
    JOIN photos p 
    ON c.comment_type = 8 AND c.object_id = p.photo_p_id OR c.comment_type = 17 AND c.object_id = p.photo_id