2012-11-13 116 views
0

我得到了我的表叫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

你能解释一下你需要的结果吗?我不明白对不起 – Marc

+0

@Marc,我想在某些car.id的'uploads'表中访问'hash'字段,而不需要为每个车号(查询循环)查询。 – Scott

+0

@Scott在下面看到我的答案,通过一个查询获取所有值:) –

回答

1

您可以使用GROUP BY和GROUB_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']; 
} 
+0

好主意!谢谢! – Scott

0

为什么不加入上传?

使用说明,以确定结果,在mysql中哪些呢:

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

如果您对cars.id和uploads.car_id指标,这应该是一个快速查询。同时打开查询缓存并查看您的统计信息,看看它是否有帮助。

0

只是做了左连接:

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

如果某个car_id有多个hash值,则只会获得多行。不是一个真正的问题。