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 条记录......所以这将是一个巨大的性能损失。

所以我的问题是,在这种情况下我能做些什么来防止循环中的查询?

4

3 回答 3

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'];
}
于 2012-11-13T21:19:15.413 回答
0

为什么不离开加入上传?

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

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

如果您在 cars.id 和 uploads.car_id 上有索引,这应该是一个快速查询。还要打开查询缓存并观察您的统计数据,看看它是否有帮助。

于 2012-11-13T21:19:07.347 回答
0

只需进行左连接:

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

当您有多个hash值时car_id,您将简单地获得多行。真的不是问题。

于 2012-11-13T21:25:37.050 回答