2014-10-01 106 views
0

我有一個表comments - >選擇條件

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

另外我有四個表humanrobotghostanimal 這些表包含有關自己的一些基本的細節...

現在我評論的價值知說:$ ID = 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 

另一種方式是做在四張桌子工會,然後加入那些:

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 

我寧願第二個選項,因爲這一個可以更容易地加入大量的detail-列。我不認爲性能方面差別很大。

+0

COALESCE .......? – 2014-10-01 12:09:28

+0

COALESCE返回第一個不爲空的值,通過左加入你「取」所有,但你只顯示不空,聰明的解決方案:) – peterpeterson 2014-10-01 12:12:12

+0

哪個更好? – 2014-10-01 12:13:32