2

私は自分のウェブサイトの写真セクションに取り組んでいますが、より正確には、並べ替えオプションを備えた次/前のリンクに取り組んでいます。

並べ替えには 2 つの異なるオプションがあり、1 つ目はフィルター (最新、トレンド、お気に入り、ユーザーなど) で、2 つ目は以前のフィルター (日付、ビュー、評価など) の並べ替えオプションです。

スライドショーの次/前の画像を簡単に取得するための適切な解決策を見つけるのに苦労しています。

これは、次の画像を取得するために私が持っている小さな SQL です。filter:latest

if ($filter == "latest") {
        $sql = "SELECT   *
                FROM     photos
                WHERE    status = 0 AND id < ".$id."
                ORDER BY id DESC
                LIMIT    1
        ";
        $result = $db->sql_query($sql);
        $sql2 ="SELECT   *
                FROM     photos
                WHERE    id = (SELECT MAX(id) FROM photos WHERE status = '0')
                ORDER BY id DESC
                LIMIT    1
    ";
    }

私のプロジェクトでこれを実装する簡単な方法があるかどうか疑問に思っていますか? たぶん、このようなことをするためのphpクラスが存在しますか?

このようにすべてを実行する必要がある場合、これらすべての SQL クエリを適切に機能させるのに長い時間を費やすことになると思います。

編集

これは私のphotosテーブルのレイアウトです

`id`              -> unique ID, autoincremented
`title`         
`img_name`        -> contains the image file name 
`date_created`    -> when the picture was uploaded
`uploader`        -> id of the user that uploaded
`views`           -> number of views the picture has
`up_votes`        -> votes used to calculate the Wilson score interval
`down_votes`
`net_votes`       -> up vote minus down votes

ユーザーと彼らが持っている友人をリンクするテーブルのような他のテーブルがあり、それは呼ばれますusers_friends

`user_id`        -> contains id of the user that added the friend 
`friend_user_id` -> contains id of the friend in question

これらの 2 つのテーブルを使用すると、次の SQL クエリを使用して、ユーザーの友人が投稿したすべての写真を取得できます。

SELECT * 
FROM photos 
WHERE uploader IN 
            (
                SELECT friend_user_id 
                FROM users_friends 
                WHERE user_id = ':user_id' 
             ) 
ORDER BY id DESC

次に、次の画像へのリンクを取得するための 2 つのクエリと、前の画像への他の 2 つのクエリがあります。2 つあるのは、1 つはデータベースの最後に到達したときにもう一方の端に戻るためのもので、もう 1 つは他のすべてのクエリのためのものだからです。そして、それらは次のようになります(ここには次のボタンのみを掲載しています)

$sql = "SELECT   *
                FROM     photos
                WHERE    status = 0 AND id < ".$id." AND Uploader IN (SELECT friend_user_id FROM users_friends WHERE user_id = ".$logedInUser['User_ID'].")
                ORDER BY id DESC
                LIMIT    1
        ";
$sql2 ="SELECT   *
                FROM     photos
                WHERE    id = (SELECT MAX(id) FROM photos WHERE status = '0' AND Uploader IN (SELECT friend_user_id FROM users_friends WHERE user_id = ".$logedInUser['User_ID']."))
                ORDER BY id DESC
                LIMIT    1
        ";
$result = $db->sql_query($sql);

if (mysql_num_rows($result)==1) { 
        $row = $db->sql_fetchrow($result);
        return "/photo/".$row["id"]."/".urlFriendly($row["Title"])."/".$filter.$sort;
} 
else 
{
        $result = $db->sql_query($sql2);
        $row = $db->sql_fetchrow($result);
        return "/photo/".$row["id"]."/".urlFriendly($row["Title"])."/".$filter.sort;
}

単純化できるものがたくさんあるような気がしますが、それを行う方法はまだわかりません。

次/前のボタンに実装するウィルソンスコアのSQLコードの下限もありますが、4回書く必要があるのはかなりのSQLコードです。おそらく、Wilson スコアをphotosテーブルに挿入できると思います。これにより、SQL コードが大幅に簡素化される可能性があります。

4

1 に答える 1

1

テーブルの構造、つまり、どの列/タイプがあり、各行が何を表しているかを投稿できると助かります。各行が写真を表すテーブルがあり、各写真には ID、ファイル名、およびフィルター/並べ替えに役立つその他のさまざまな列 (日付、お気に入りなど) があると仮定します。

フィルタリングと並べ替えの設定がユーザーによって定義されている場合は、それらを単一の SQL クエリで使用できるため、順序付けされた結果の完全なセットを取得できます。例えば:

$sort = date;
$filter = favorite;

$sql = "SELECT ID, filename, [other vars here]
        FROM photos
        WHERE " . $filter . " = TRUE
        ORDER BY ". $sort . " DESC";
$result = $db->sql_query($sql);

これで、mysql_fetch_array などの関数を使用して、結果セットの各行をステップ実行し、現在、前、および次の写真を何らかの種類のデータ構造に取り込むことができます。

于 2012-07-24T00:34:22.197 に答える