从MySQL数据库中查找下一个/上一个电视节目

时间:2013-07-30 18:52:01

标签: php mysql

我已经陷入了困境。我有一个包含字段id,showid,季节,剧集和其他一些任意数据的数据库。我有一个php页面来显示有关节目剧集的信息,它通过将id作为get变量来工作。我希望实现的是有一个链接到这个电视节目的下一集和上一集但是节目不一定按顺序,所以简单地增加或减少id将无济于事。 所以我会在$rows中使用以下MySQL查询获取剧集并存储:

SELECT id FROM episodes WHERE showid = $id ORDER BY season, episode;

现在无需循环播放数组(对于某些节目而言可能相当大)是否有一种简单的方法让我找到下一集和上一集?我敢肯定,我无法想到它。

修改 我一直在考虑这个问题,并没有任何有用的东西(尽管感谢你的帮助,非常感谢)。我所想到的是询问同一季节是否存在更高的一集,如果没有另外查询以找到当时下一个最低季节的最低集 - 或者沿着这些行的某些东西 - 然后重复前一个。你觉得怎么样?

编辑2: 我想我会发布我的最终代码以供将来参考。 在这里,我找到了nex和之前节目的id(如果存在的话)。

查找下一集:

try {
    // First check for a show of the same season but the next lowest episode number
    $stmt = $dbh->prepare("SELECT id FROM episodes WHERE showid = :show AND season = :s AND episode > :e ORDER BY episode LIMIT 1;");
    $stmt->execute($pars);
    $rows = $stmt->fetchAll();
    if(count($rows) > 0) { // If there is one this is our next id
        $nextid = $rows[0]['id'];
    } else {
        // Otherwise check for an episode of a higher season number
        $stmt = $dbh->prepare("SELECT id FROM episodes WHERE showid = :show AND season > :s ORDER BY season, episode LIMIT 1;");
        $stmt->execute($pars);
        $rows = $stmt->fetchAll();
        if(count($rows) > 0) { // If there is one this is our next id.
            $nextid = $rows[0]['id'];
        } // Otherwise no next id is set and so no next link will be created.
    }
} catch(PDOException $e) {
    die("Error: " . $e->getMessage());
}

找到上一集:

try {
    // First check for an episode in same season of the next highest episode number.
    $stmt = $dbh->prepare("SELECT id FROM episodes WHERE showid = :show AND season = :s AND episode < :e ORDER BY episode DESC LIMIT 1;");
    $stmt->execute($pars);
    $rows = $stmt->fetchAll();
    if(count($rows) > 0) { // If one is found then this is our prev id.
        $previd = $rows[0]['id'];
    } else {
        // Otherwise check for an episode of a lower season number.
        $stmt = $dbh->prepare("SELECT id FROM episodes WHERE showid = :show AND season < :s ORDER BY season DESC, episode DESC LIMIT 1;");
        $stmt->execute($pars);
        $rows = $stmt->fetchAll();
        if(count($rows) > 0) { // If there is one this is our prev id.
            $previd = $rows[0]['id'];
        } // Otherwise no prev id is set and so no prev link will be created.
    }
} catch(PDOException $e) {
    die("Error: " . $e->getMessage());
}

然后我有以下链接:

if($previd) echo "<a href=\"/tv/view/" . $previd . "/\">Previous Episode</a>";
if($nextid) echo "<a href=\"/tv/view/" . $nextid . "/\">Next Episode</a>";

3 个答案:

答案 0 :(得分:1)

为什么不像表的分页符那样做,但只显示实际页面的一个条目。 您可以通过以下方式解释您的查询来执行此操作:

SELECT id FROM episodes WHERE showid = $id ORDER BY season, episode LIMIT 0,1;

其中0是偏移量。这意味着你必须增加的起始记录。 这里举个例子:

SELECT id FROM episodes WHERE showid = $id ORDER BY season, episode LIMIT $page,1;

然后你只需要在你的URL中传递实际显示的剧集的页面作为GET参数“?page = 0”。上一集是第1页,下一页是第+ 1页。

唯一的缺陷是你必须检查拳头和拉斯节目。要知道何时不可能使用上一个或下一个。

答案 1 :(得分:0)

如果id没有任何特定的顺序,那么你必须基本扫描表当前的位置,然后使用最后提取的和即将获取的记录作为上一个/下一个剧集,例如

$row = mysql_fetch_assoc($result);
$previous_episode = $row['id']; // prime the system
do {
   if ($row['id'] == $id_of_current_episode) {
       $next_row = mysql_fetch_assoc($result);
       $next_episode = $row['id'];
       break;
   }
} while($row = mysql_fetch_assoc($result));

这不会处理你已经优雅地进入最后一集的情况,但是应该让你开始。

答案 2 :(得分:0)

我在这个帖子中发布了3次我的不好,但是如果你的剧集和ID没有订购那么就我所知,没有办法做到这一点

修正您的ID