SQL用于整理图库中的下一张/上一张图片

时间:2012-07-23 20:10:16

标签: php mysql sql

我正在处理我网站的照片部分,但更确切地说是使用排序选项的下一个/上一个链接。

存在两种不同的排序选项,首先是过滤器(最新,趋势,收藏,用户等),其次是某些先前过滤器的排序选项(日期,视图,评级等)< / p>

我无法找到一个好的解决方案来轻松检索幻灯片的下一张/上一张图片。

这是我用于获取filter:latest

的下一张图片的一点点SQL
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

通过这两个表,我可以使用这个SQL查询获取用户的朋友发布的所有图片:

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

然后我有两个查询来获取下一张图片的链接和另外两张查询。我有两个,因为当你到达数据库的最后一个回到另一个端时,另一个用于所有其他查询。他们看起来像这样(我只在这里张贴下一个按钮)

$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;
}

我觉得有很多东西可以简化,但我还不知道该怎么做。

我还有Wilson得分sql代码的下限来实现下一个/上一个按钮,并且它有相当多的sql代码必须写4次。也许我可以在photos表中插入Wilson分数,这可以简化很多sql代码。

1 个答案:

答案 0 :(得分: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等函数逐步遍历结果集中的每一行,并使用当前,上一张和下一张照片填充某种数据结构。