0

私は2つのテーブルを持っています:

1 つはデータと呼ばれ、ID ごとに 1 つの (一意の) 行しかありません。2 番目はイメージと呼ばれ、ID ごとに 3 行あります。

ページが読み込まれるたびに、正確に 5 つの異なる ID のデータと 1 つの画像を取得したいと考えています。

私の質問は次のとおりです。2 つの個別の SELECT クエリ、または両方が結合された 1 つのクエリ。

クエリ:

...

$all = $row["iD"] // includes **5** last iDs - fetched from DB
$all = implode(',',$all);

SELECT Name, Address FROM data WHERE iD IN($all);
SELECT url FROM images WHERE iD IN ($all) LIMIT 1;

私はすでにページ上に他の 3 つの選択クエリを持っているので、パフォーマンスに関して何が最適かを知りたいと思います。

結合するとしたら、この 2 つをどのように結合しますか?

4

3 に答える 3

1

ID ごとに 3 つの画像があり、最後に挿入された画像 (別名「最近のコンテンツ」) 用に ID ごとに 1 つの画像が必要ですか?

次に、次のように group by と組み合わせた簡単な自然結合を 1 つ使用できます。

SELECT d.Name, d.Address, MAX(i.url) 
FROM data d, images i
WHERE i.iD = d.iD
GROUP BY d.Name, d.Address
ORDER BY d.iD DESC
LIMIT 5

ほとんどの場合、select を組み合わせてプログラムのオーバーヘッドをスキップすることをお勧めします (たとえば、ループ自体で mysql_query() を呼び出す)。ただし、基礎となるデータに依存する場合もあります。

于 2012-08-31T12:01:50.357 に答える
0

クエリは完全に別々のテーブルに送られるため、2 つの別々のクエリを使用することをお勧めします。これにより、結果セットが小さくなり、少なくとも 1 つがクエリ キャッシュに残る可能性が高くなります。

2 番目のクエリについて: これは特別な URL を取得することが保証されていないことを理解していますか? ほとんどの場合、キーによる最初のものですが、そうであるとは限りません。

于 2012-08-31T12:04:33.463 に答える
0

パフォーマンスの問題に関する回答については、「JOIN クエリと複数のクエリ」を参照してください。そこから理解できることは、パフォーマンスの問題は特定の状況によって異なるため、両方をテストする必要があるということです。

参加するには、次のことができます。

SELECT User.iD, User.Name, User.Address, Image.url
FROM images as Image
JOIN data as User
  ON Image.iD = User.iD
WHERE Image.iD IN ($all)
LIMIT 1;

まだテストされていないので、塩の粒でそれを取る必要があります. それは少なくとも出発点です。

于 2012-08-31T12:15:16.750 に答える