私は自分のウェブサイトの写真セクションに取り組んでいますが、より正確には、並べ替えオプションを備えた次/前のリンクに取り組んでいます。
並べ替えには 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 コードが大幅に簡素化される可能性があります。