0

という名前のテーブルを取得し、フィールドを持つcars2 番目のテーブルを取得しました。このようなループで2 番目のクエリを使用する必要がありますか?uploadscar_idLEFT JOINuploads.car_id = cars.iduploads

$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 関数を使用して、1 つのクエリで必要なものを取得し、パフォーマンスを向上させることができます。

試す :

$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 に答える