我的桌子名为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条记录......所以这将是一个巨大的性能损失。
所以我的问题是,在这种情况下我该怎么做才能阻止循环中的查询?
答案 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
值,您只需获得多行。不是真的有问题。