我有这两个表:
画廊 - {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';`
还是有更好的方法吗?谢谢。
答案 0 :(得分:1)
(A)是一种简单的方法,但需要对数据库进行多次查询。如果你的数据库服务器很忙,那么由于这个原因,它将更加如此。
(B)是工程师的出路,使用较少的数据库调用,通常是最有效的数据库调用。但是,它需要您使用我们在大学中学到的分组逻辑逻辑。
当我编码时,我采用(B)方式。当我周围的人编码时,他们大多数(99%以上)编码(A)方式!当我告诉这些人我使用(B)的理由时,他们说他们的客户有钱购买更好的硬件,如果需要的话!
干杯!
答案 1 :(得分:1)
我认为B是最好的选择,因为在A中你需要为每个查询获得数据库的连接,然后在数据库中多次发送几乎相同的查询(只在where子句中使用不同的id),&取得&再次处理结果,所以你有一个不必要的过程&数据传输开销 许多程序员不使用join语句,因为他们认为它使查询过于繁重!但除非您的连接表有大量的行,否则我不认为像B这样的简单连接会导致任何问题。只需注意使用连接以避免选择未使用的行或列 结果,我可以保证B是你最好的解决方案!
答案 2 :(得分:1)
我不喜欢A,因为有嗜好。 我不喜欢B,因为你运行的每个查询都有开销。
如果我存储来自两个表的数据。我在一个查询中获取画廊并将它们存储在一个数组中。 然后我会在循环中获取我所需的图像数量,这可能会缓存它们以避免再次出现,但这取决于许多注意事项
如果它不是一个大音量,我可能会耸耸肩,使用A或B中的任何一个使我的代码更具可读性。它们以自己的方式效率低下,但是围绕它会增加设计的复杂性。它值得吗?
答案 3 :(得分: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';
...