0

我想在用户搜索结果中显示他们的照片。不仅是头像照片,还有3张照片。照片在额外的表 user_photos 中。如果我会为每个用户获得单行,那么答案将很明确 - 内部连接。但我会为每个用户获得多行。

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

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[$result['user_id']]['photos'] 数组的第二级循环。

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

4

3 回答 3

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           |
+-------------------------------------+
于 2012-07-12T08:40:50.073 回答
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()来解包数组。

于 2012-07-12T08:31:44.873 回答
1

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

第二个选项效率极低,因为它给数据库带来了更多的工作要做,并且大大增加了脚本和数据库之间的流量。

实际上,我之前展示过的第 3 个选项可以在这样的情况下实现,即将照片信息转换为表示可以在 PHP 中使用GROUP BY和解码的向量的标量值GROUP_CONCAT()(我在过去)但我不能说我会推荐它,尽管如果你愿意我会说明它。

于 2012-07-12T08:34:19.517 回答