0

私は Pinterest のようなスタイルのサイトを構築していますが、開発の非常に初期の段階にあります。

問題なくできますが、それが最善の方法かどうか知りたいです。

目的:

データベースからすべての画像データを抽出し、それぞれについて「お気に入り」テーブルからデータを抽出し、写真のお気に入りをカウントします。次に、アクティブなユーザー セッションがある場合は、ユーザーがお気に入りとしてマークしたかどうかを確認します。

問題

このサイトにはデフォルトで 54 枚の写真が表示されます。これらの 54 枚の写真について、プログラムはそれぞれの写真のお気に入りを探す必要があります。これは、サーバーとデータベースへの多くのリクエストを表しています。

$images = 'SELECT * FROM IMAGES photo_id ORDER BY LIMIT 54';

foreach ( $images as $image ) {
   $lookFavorite = 'SELECT * FROM favorites WHERE photo_id ='. $ image ['photo_id'] ';
}

データベース テーブルの構造

写真

photo_id    INT (auto increment)
user_nick   VARCHAR (25)
photo_path  VARCHAR (255)
photo_title VARCHAR (150)
photo_theme VARCHAR (60)
date        TIMESTAMP

お気に入り

photo_id  INT
user_nick VARCHAR (25)
date      TIMESTAMP

重要

PHP version 5.3, using MySQL.
The program I'm building is object oriented [I'm using PDO'].
4

4 に答える 4

2

お気に入りが0の画像がある場合は、画像からお気に入りへの左結合を使用し、必要に応じてGROUPBYを使用してカウントを取得する必要があります。

SELECT * 
FROM `images` 
LEFT JOIN `favorites` ON `images`.`photo_id`=`favotites`.`photo_id`
于 2013-03-11T20:40:49.557 に答える
0

1 すべてのフィールドが必要ない場合は、* を使用しないでください。

サーバーでテストしますが、このソリューションはより速く機能すると思います

$images = 'SELECT photo_id, photo_path FROM photos LIMIT 54';
$ids = array();
foreach ( $images as $image ) {
  $ids[]= $image ['photo_id'];
}

$lookFavorite = 'SELECT * FROM favorites WHERE photo_id in ('. implode(',',$ids). ')';
于 2013-03-11T20:52:09.960 に答える
0

ループをドロップして行う

$lookFavorite = 'SELECT * FROM favorites';

すべての配列を作成し、取得したものに基づいてその配列から必要なものを循環します

$images = 'SELECT * FROM IMAGES photo_id ORDER BY LIMIT 54';

この方法では、実行されるクエリは 55 回ではなく 2 回だけです。

また

$images = 'SELECT * FROM photos INNER JOIN favorites ON (favorites.photo_id = photos.photo_id) ORDER BY favorites.photo_id LIMIT 54';

単一のクエリでそれを行う

于 2013-03-11T20:36:13.917 に答える
0

ここで探しているのは LEFT JOIN だと思います。

SELECT * FROM images
LEFT JOIN favorites
ON images.photo_id = favorites.photo_id
WHERE images.photo_id IN (..array populated from first query..)

結果を最初の 54 個の画像だけに制限する必要がある場合は、JOIN の WHERE 句に適切な述語を入力するだけです。

余談ですが、お気に入りがない場合でもすべての画像をそのリストに含めたいので、LEFT JOIN を選択しましたが、必要な画像に関係のないお気に入りは含めたくありません。

于 2013-03-11T20:44:48.327 に答える