MYSQL:查询以获取上一个和下一个视频ID?

Posted

技术标签:

【中文标题】MYSQL:查询以获取上一个和下一个视频ID?【英文标题】:MYSQL: Query to get previous and next video ID? 【发布时间】:2009-07-04 09:11:00 【问题描述】:

我正在开发一个视频网站 (php - mysql),就像 youtube,我想在其中提供 Next 视频和 Previous 视频的功能。假设我目前在videoId: 234,所以下一个和上一个视频链接将分别指向videoId: 233235

我的表结构如下:

videoId      videoName    videoURL      IsActive
-----------------------------------------------------
1            Love world    love-world        1
2            Hello world   hellow-world      1
3            World news    world-news        0
4            The web       the-web           1
5            Google web    google-web        1
6            Internet      internet          1

IsActive a bool (0,1) type column 基本上告诉视频是否可以在网站上观看。如果它的 0 - 不可见和 1 - 可见

现在有两种情况,我认为是:

当我浏览 videoId: 4 时,我想运行一个查询来获取下一个和上一个视频 id 分别表示 2 和 5,3 不是因为它被禁用。

李>

其他条件是当我浏览 videoId: 1 时,查询应该只返回一条记录,即 2,因为没有以前的记录,与最后一条记录相同。

李>

请告诉我如何查询这个?

谢谢

【问题讨论】:

在这里做了一堆假设,但考虑一下会发生什么情况:用户观看“Hello World”视频,管理员(或谁曾经)将“The Web”标记为非活动状态。该用户点击下一步。 【参考方案1】:

我认为你可以使用类似的东西:

SELECT * 
  FROM videos AS c 
 WHERE (VideoId = (SELECT MAX(VideoId) FROM videos WHERE VideoId < c.VideoId AND IsActive = 1)
    OR  VideoId = (SELECT MIN(VideoId) FROM videos WHERE VideoId > c.VideoId AND IsActive = 1))

【讨论】:

【参考方案2】:

我会用

 SELECT * FROM videos WHERE videoId > :id AND IsActive = 1 LIMIT 1
 UNION
 SELECT * FROM videos WHERE videoId < :id AND IsActive = 1 LIMIT 1

【讨论】:

【参考方案3】:

这将得到下一个

$stmt = $PDO->prepare("SELECT * FROM vedios WHERE vedio > :id AND IsActive = 1")
$stmt->execute(array("id" => $id));
$all = $stmt->fetchAll(PDO::FETCH_ASSOC);

然后将 > 更改为 count($all) 返回 0,那么您没有下一个/上一个视频。

【讨论】:

好的,但是是否可以使用单个查询同时获取两行中的下一个和上一个?【参考方案4】:

试试这个。完全未经测试,但这会给你一个正常的行,其中包含两个额外的列“nextID”和“prevID”。如果其中一个为空,则没有一个。

SELECT v.*, n.id AS nextID, p.id AS prevID
  FROM vedios v
       LEFT JOIN (SELECT vn.id FROM vedios vn WHERE vn.id > v.id AND isActive = 1 ORDER BY id ASC LIMIT 1) n
       LEFT JOIN (SELECT vp.id FROM vedios vp WHERE vp.id < v.id AND isActive = 1 ORDER BY id DESC LIMIT 1) p

如果您有任何问题/错误,请告诉我,我会正确测试。

【讨论】:

【参考方案5】:

最佳查询字符串:

SELECT
        (SELECT MAX(`id`) FROM `table` WHERE `id` < `t`.`id`) as `_prev_id`,
        (SELECT MIN(`id`) FROM `table` WHERE `id` > `t`.`id`) as `_next_id`

  FROM `table` `t`

 WHERE `t`.`id` = '1'

 LIMIT 1

【讨论】:

以上是关于MYSQL:查询以获取上一个和下一个视频ID?的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 查询当前数据上一条和下一条的记录

如何在MySQL中查询当前数据上一条和下一条的记录

mysql获取上一条和下一条记录id

MySQL 查询以获取产品变体

mysql查询以获取列中每个元素的计数

MySQL查询以获取日期范围内的端点?