MySQL在另一个表中选择具有多行的行

时间:2012-05-16 17:00:37

标签: mysql

我有这两个表:

画廊 - {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 个答案:

答案 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';
...