2009-07-04 7 views
3

Je développe un site Web vidéo (PHP - MYSQL), tout comme YouTube, dans lequel je veux fournir la fonctionnalité de vidéo Next et vidéo Previous. Disons que je suis actuellement sur videoId: 234 donc liens vidéo Suivant et Précédent pointeront videoId: 233 et 235 respecively.MYSQL: Demande d'obtenir l'ID de la vidéo précédente et suivante?

Ma structure de table est la suivante:

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 est dit essentiellement que la vidéo est visible sur le site ou non. Si son 0 - notviewable et 1 - visible

Maintenant, il y a deux types de situations que je sont cependant:

  • Quand je parcourais videoId: 4 alors je veux exécuter une requête pour obtenir la l'id vidéo suivant et précédent signifie respectivement 2 et 5, 3 n'est pas parce qu'il est désactivé.

  • Autre condition serait Lorsque je suis en train de parcourir videoId: 1 alors la requête devrait retourner un seul enregistrement qui est 2, car il n'y a pas d'enregistrement précédent, même dans le cas du dernier enregistrement.

S'il vous plaît dites-moi comment faire une requête pour cela?

Merci

+0

faire un tas d'hypothèses, mais Considérez ce qui se passera si: utilisateur affiche la vidéo « Bonjour tout le monde », Une marques admin (ou qui jamais) « La Web "comme inactif. que l'utilisateur clique sur suivant. –

Répondre

3

Je pense que vous pouvez utiliser quelque chose comme:

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

Cela obtenir le prochain

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

Et changer> à < pour précédent. Si count($all) renvoie 0, vous n'avez pas de vidéo suivante/précédente.

+0

Ok, mais est-il possible de récupérer à la fois le suivant et le précédent sur deux lignes en utilisant une seule requête? – Prashant

2

J'utilise

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

essayer. Complètement non testé, mais cela vous donnera une ligne normale avec deux colonnes supplémentaires 'nextID' et 'prevID'. Si l'un d'eux est nul, alors il n'y en a pas.

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 

Si vous avez des problèmes/erreurs avec lui, faites le moi savoir et je vais le tester correctement.

0

meilleure chaîne de requête:

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 
Questions connexes