2014-10-01 78 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