我正在开发一个视频网站(PHP - MYSQL
),就像youtube一样,我希望在其中提供Next
视频和Previous
视频的功能。假设我目前正在使用videoId: 234
,因此下一个和上一个视频链接将分别指向videoId: 233
和235
。
我的表格结构如下:
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,因为没有先前的记录,在最后一条记录的情况下也是如此。
请告诉我如何查询?
由于
答案 0 :(得分:3)
我认为你可以使用类似的东西:
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))
答案 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
答案 2 :(得分:0)
这将获得下一个
$stmt = $PDO->prepare("SELECT * FROM vedios WHERE vedio > :id AND IsActive = 1")
$stmt->execute(array("id" => $id));
$all = $stmt->fetchAll(PDO::FETCH_ASSOC);
并更改&gt;到&lt;以前的。如果count($all)
返回0,那么您没有下一个/上一个视频。
答案 3 :(得分:0)
试试这个。完全未经测试,但这将为您提供一个正常的行,其中包含两个额外的列'nextID'和'prevID'。如果其中一个为null,则没有一个。
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
如果您有任何问题/错误,请告诉我,我会正确测试。
答案 4 :(得分:0)
最佳查询字符串:
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