如何连接三个表并显示结果?

问题描述:

我想了解如何加入并显示来自三个表的数据,并创建了这三个列表人(person),水果类型(fruit)和水果人(favs)如何连接三个表并显示结果?

Person    Fruit     Favs 

id | name  id | type  id | person_id | fruit_id 

1 | Peter  1 | apple  1 | Peter  | orange 
2 | Sue   2 | orange  2 | Sue  | apple 
3 | John   3 | banana  3 | John  | banana 
4 | Mary       4 | Peter  | apple 
            5 | Sue  | orange 

我的目的是要了解如何加入所有三个表并显示哪些水果(如果有的话)的人喜欢。 就像这样:

Peter | orange, apple 
Sue | apple, orange 
John | banana 
Mary | 

我只是了解如何加入所有三个表显示上述数据,但真正让我困惑的是如何呼应出结果的事情。我应该使用嵌套的while循环还是foreeach循环?我很困惑,真的很感谢有人给我指路。 我得到的最接近的就是这个(我知道的很遥远)。

<?php 

$sql="SELECT person.name, favs.fruit_id 
     FROM person LEFT JOIN favs 
     ON person.name = favs.person_id 
     ORDER by person.id"; 

$result_set=mysql_query($sql); 

while($row=mysql_fetch_array($result_set)) 
{ 
    echo $row['name']; 
    echo $row['fruit_id']; 
    echo '<br />'; 
} 
+1

尝试GROUP_CONCAT – rjdown

+0

看看这个http://stackoverflow.com/questions/273238/how-to-use-group-by- sql-server –

+0

你最喜欢的表应该使用外键的ID,而不是它们的值 – Jaime

好您的表数据。例如,我认为在表的收藏你放在名字可读性,那岂不是在标识自己。假设使用GROUP_CAT的情况下你的SQL语句应该是:

SELECT p.name, GROUP_CONCAT(ft.name) 
FROM favs f 
INNER JOIN fruit ft ON ft.id = f.fruit_id 
LEFT JOIN person p ON p.id = f.person_id 
GROUP BY f.person_id 
+0

好吧,你很正确。你的查询是有效的(我调整了:'LEFT JOIN person p ON p.name = f.person_id'。但是为什么玛丽从结果中被省略,她没有'fav',但她仍然应该出现在它们中? – JulianJ

+1

改变LEFT加入到右连接中,注意Mary,因为没有数据,Mary的结果将为NULL – jasonlam604

只要做到这一点是这样的:

SELECT Person.id,Fruit.name FROM Person INNER JOIN Person.id=Fruit.person_id WHERE ...