获取多个表数据而不会丢失性能?

时间:2012-11-13 21:04:58

标签: mysql performance

我的桌子名为cars,第二个名为uploads的桌子有一个car_id字段,我可以LEFT JOIN这个,所以uploads.car_id = cars.id问题来了,uploads表,对于某些车辆ID的多个记录,那么呢?我必须像这样使用第二个查询循环吗?

$cars = $PDO->query("SELECT * FROM `cars`")->fetchAll();
foreach($cars as $car)
{
    $uploads = $PDO->query("SELECT * from uploads WHERE id = " . (int)$car['id'])->fetch();
    echo 'My upload file name:' . $uploads['hash'];
}

?这不是一个好主意,因为$cars查询可能一次返回超过500条记录......所以这将是一个巨大的性能损失。

所以我的问题是,在这种情况下我该怎么做才能阻止循环中的查询?

3 个答案:

答案 0 :(得分:1)

您可以使用GROUP BY和GROUP_CONCAT sql函数在一个查询中获得您想要的效果

尝试:

$cars = $PDO->query("SELECT cars.id as carID, GROUP_CONCAT(hash) AS hashs FROM uploads left join cars on uploads.car_id = cars.id group by cars.id ")->fetchAll();

foreach($cars as $car)
{
   echo 'Car id '.$car['carID'].'  --  uploaded files name:' . $uploads['hashs'];
}

答案 1 :(得分:0)

为什么不上传加入?

使用Explain确定结果,在mysql中做什么:

explain select * from cars left join uploads on cars.id = uploads.car_id where id=1;

如果你有cars.id和uploads.car_id的索引,这应该是一个快速查询。同时启用查询缓存并观察您的统计信息以查看它是否有帮助。

答案 2 :(得分:0)

只做左连接:

select c.id, u.hash
from cars c
left join upload u on c.id = u.car_id;

如果某个hash有多个car_id值,您只需获得多行。不是真的有问题。