2012-07-12 106 views
0

我想在用户搜索结果中显示他们的照片。不仅头像照片,但3张照片。照片在额外的表user_photos中。如果我得到单行每个用户的答案将是明确的 - 内部加入。但是我会为每个用户获得多行。每个结果的子查询或使用php循环或内部连接...?

我可以用第一种方法是加入:

SELECT * FROM users INNER JOIN photos ON photos.user_id=users.user_id 

在这种情况下,我需要一些额外的PHP代码合并与同USER_ID结果。是这样的:

foreach($results as $result){ 
    if(isset($user[$result['user_id']]['age'])){ 
    $user[$result['user_id']]['photos'][] = $result['photo']; 
    continue; 
    }  
    $user[$result['user_id']]['age'] = $result['age']; 
    $user[$result['user_id']]['photos'][] = $result['photo']; 
    //... 
} 

如果是视图我需要为用户第一第一级循环,然后用于$用户[$结果[“USER_ID”]] [“照片”]阵列中的每个用户第二级环路。

或我可以用于每个结果子查询。没有任何选择看起来优雅,所以我想知道是否有其他方式。如果不是,可能第一个选择是一种方法,对吗?

+0

这是什么意思段:用同样的USER_ID等领域,_merge结果**照片除外** ..._ – hjpotter92 2012-07-12 08:15:01

+0

我以更好的方式进行说明。 – JohnyFree 2012-07-12 08:27:17

回答

1

你想用GROUP_CONCAT,所以你会得到这样的事情:

select u.*, group_concat(photos.name SEPARATOR ' & ') as photonames 
from users u 
    join photos on photos.user_id=users.user_id 
group by a.user_id; 

然后,你可以简单地使用explode()解压阵列。

1

尽管您不止一次检索用户数据(它会针对每个匹配的图像返回),但第一个选项是要走的路,它比第二个选项更有效。

第二种方法效率极低,因为它使数据库有更多的工作要做,以及非常严重地增加脚本和数据库之间的流量。

其实是有,我以前已经证明可以在这样的情况下实现的第三个选择,就是用GROUP BYGROUP_CONCAT()的照片信息转换为标量值表示可以在PHP解码矢量(我过去曾使用过JSON)但我不能说我会推荐它,但如果你愿意,我会说明它。

2

对于您的原始问题,第一个选项通常是要减少不必要地发送到数据库的查询数量的方法。

但是,我更喜欢Dows的答案,这几乎就是我的想法。在一个变化我会做会使得加入LEFT JOIN让谁没有照片在查询结果中仍会返回,所以在更新自己的查询用户:

select u.*, group_concat(photos.name SEPARATOR ' & ') as name 
from users u 
    join photos on photos.user_id=u.user_id 
group by u.user_id; 

将返回沿线结果的:

+-------------------------------------+ 
|user_id |photo      | 
+----------+--------------------------+ 
|1   |photo1 & photo2 & photo7 | 
+----------+--------------------------+ 
|2   |      NULL| 
+----------+--------------------------+ 
|3   |photo3 & photo5   | 
+-------------------------------------+