2014-10-01 3 views
0

에 따라 comments -> 또한 내가 네 이상의 테이블 human, robot, ghostanimal 이 테이블 자신에 대해 몇 가지 기본적인 세부 사항이 포함되어 있습니다선택은 내가 테이블이 조건

id | comment | type | userid | 
1 Hello  human 9 
2 Hi  robot 4 
3 Gnaw!  animal 1 
4 Boo  ghost 2 

...

이제

나는 의견의 노하우 값은 말을했다 : $ 아이디 = 3 내가 할 경우

$data = mysqli_query($con,"SELECT type FROM comments WHERE id = $id"); 
while($row = mysqli_fetch_assoc($data)){ 
     $table = $row['type'];   
     $table_data = mysqli_fetch_assoc(mysqli_query($con,"SELECT * FROM $table")); 
} 

댓글을 달았던 사람에 대한 모든 데이터를 가져 오지만 너무 느려질 것입니다. 이것을 결합 할 수있는 방법이 있습니까? 하나의 쿼리?

답변

1

왼쪽 조인을 사용하는 한 가지 방법이 있습니다.

SELECT c.type, COALESCE(h.detail,r.detail,a.detail,g.detail) 
FROM comments 
LEFT JOIN human h ON c.type = 'human' AND c.id = h.id 
LEFT JOIN robot r ON c.type = 'robot' AND c.id = r.id 
LEFT JOIN animal a ON c.type = 'animal' AND c.id = a.id 
LEFT JOIN ghost g ON c.type = 'ghost' AND c.id = g.id 

또 다른 방법은 네 개의 테이블에 UNION을하고 그 가입하는 것이 하나가 쉽게 세부 - 많은 가입 할 수 있기 때문에,

SELECT c.type, q1.detail 
FROM comments c 
LEFT JOIN 
(
    SELECT 'human' AS type, detail FROM human 
    UNION 
    SELECT 'robot', detail FROM robot 
    (etc.) 
) q1 ON c.type = q1.type AND q1.id = c.id 

내가 두 번째 옵션을 선호하는 것 열. 나는 성능 차이가별로 없다고 생각한다.

+0

COALESCE .......? –

+0

COALESCE는 왼쪽 JOIN을 수행하여 모두 "가져 오기"를 수행하지만 비어 있지 않은 영리한 솔루션 만 표시하여 비어 있지 않은 첫 번째 값을 반환합니다. – peterpeterson

+0

더 좋을까요? –