2009-07-04 83 views
3

我正在開發視頻網站(PHP - MYSQL),就像youtube一樣,我想在其中提供Next視頻和Previous視頻的功能。假設我目前處於videoId: 234,所以Next和Previous視頻鏈接將分別指向videoId: 233235MYSQL:查詢獲取上一個和下一個視頻ID?

我的表結構如下:

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 - notviewable和1 - 可見

現在有兩個類型的,我雖然有些情況:

  • 當我通過視頻ID的瀏覽:4,然後我想運行一個查詢來獲取下一個和上一個視頻ID分別表示2和5,3不是因爲它被禁用。

  • 其他條件會是當我瀏覽videoId:1時,查詢應該只返回一條記錄,因爲沒有以前的記錄,在最後一條記錄的情況下是相同的。

請告訴我如何查詢這個?

感謝

+0

做了一堆假設,在這裏,但試想,如果會發生什麼: 用戶查看的「Hello World」的視頻, 的管理員(或誰曾)標記的」 Web「爲非活動狀態。 下一個用戶點擊。 – 2009-07-04 15:37:38

回答

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)) 
0

這將讓下一個

$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,那麼你沒有下一個/上一個視頻。

+0

好吧,但是有可能使用單個查詢在兩行中獲取下一個和上一個? – Prashant 2009-07-04 09:28:37

2

我會使用

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

試試這個。完全沒有經過測試,但這會給你一個正常的行,並有兩列'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 

如果您有任何問題/錯誤,請告訴我,我會正確測試它。

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 
相關問題