0

我有这两张表:

画廊 -{id,title,description}
图片 -{id,gallery_id,file}

每个画廊在图像表中有多个图像。

如何最好地解决这个问题:

A.选择所有画廊而不是运行一个 for 循环,并为每个画廊重新查询与它相关的每个图像的数据库。


$sql='select * from galeries';
$result=mysql_query($sql);
while($row=mysql_fetch_assoc($result))
{
    $sql2='select * from images where gallery_id='.$row['id'];
    //etc
}

B.使用左连接选择所有画廊和图像,从而多次获得画廊信息,与画廊拥有图像的次数一样多。

$sql='select * from galleries left join images on galleries.id=images.gallery_id';`

或者,还有更好的方法?谢谢你。

4

4 回答 4

1

(A) 是一种简单的方法,但需要对数据库进行多次查询。如果您的数据库服务器很忙,因此会更忙。

(B) 是工程师的出路,使用较少的数据库调用,通常是最有效的数据库调用。但是,这将要求您使用我们在大学中学到的分组休息逻辑。

当我编码时,我采用 (B) 方式。当我周围的人编码时,他们大多 (99%+) 以 (A) 方式编码!当我告诉这些人我使用 (B) 的理由时,他们说如果需要,他们的客户有钱购买更好的硬件!

干杯!

于 2012-05-16T17:27:57.913 回答
1

我认为 B 是最好的选择,因为在 A 中,您需要为每个查询获取到数据库的连接,然后多次向数据库发送几乎相同的查询(仅在 where 子句中使用不同的 id),并获取并处理结果再次出现,因此您有不必要的流程和数据传输开销。
许多程序员不使用连接语句,因为他们认为这会使他们的查询过于繁重!但除非您的连接表有大量的行,否则我认为像 B 这样的简单连接不会导致任何问题。只需注意使用连接以避免选择未使用的行或列。
因此,我可以保证 B 是您的最佳解决方案!

于 2012-05-16T17:57:50.057 回答
1

我不喜欢A,因为重复。我不喜欢 B,因为您运行的每个查询都有开销。

如果我从两个表中存储数据。我会在一个查询中获取画廊并将它们存储在一个数组中。然后我会在循环中获取最少数量的画廊所需的图像,可能会缓存它们以避免再次出现,但这取决于许多考虑因素

再说一次,如果它不是一个大容量,我可能会耸耸肩并使用 A 或 B 中的任何一个使我的代码更具可读性。它们都以自己的方式效率低下,但工作会增加设计的复杂性。值得吗?

于 2012-05-16T21:38:54.243 回答
1
# you want to get latest 10 galleries, I assume
$query = 'SELECT * FROM `galleries` ORDER BY `id` DESC LIMIT 10';
$result = mysql_query($query);

while($row = mysql_fetch_object($result)) {
    $ids = isset($ids) ? ', '.$row->id : $row->id;
}

# you really don't want to get all the images
# limit amount to some number, ex: 200
$query = 'SELECT * FROM `images` WHERE `gallery_id` IN('.$ids.') ORDER BY `id` DESC LIMIT 200';
...
于 2013-07-23T13:29:44.833 回答