MYSQL: önceki ve sonraki video kimliği almak için sorgu?

5 Cevap php

Ben bir video web sitesi geliştirme (PHP - MYSQL), Sadece Next video ve Previous video işlevselliği sağlamak istediğiniz youtube, gibi. Am Diyelim ki videoId: 234 böylece Önceki ve Sonraki video linkleri videoId: 233 işaret ve 235 sırası ile şu anda duyuyorum diyelim.

Aşağıdaki gibi benim tablo yapısı:

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 temelde video web sitesindeki veya görüntülenebilen olduğunu söyler. Eğer onun 0 - notviewable ve 1 - görüntülenebilir

Şimdi olsa olduğu durumlarda iki türü vardır:

  • Ben videoId arasında dolaşıyordum am zaman: 4 sonra devre dışı olduğundan 3 değil, sonraki ve önceki video sırasıyla id 2 ve 5 gelir elde etmek için bir sorgu çalıştırmak istiyorum.

  • Ben videoId arasında dolaşıyordum olduğum zaman başka bir durum olurdu: son kaydın durumunda aynı hiçbir önceki rekor, var çünkü 1 daha sonra sorgu, 2 sadece bir kayıt dönmelidir.

Nasıl bunun için sorgu yapmak için söyle lütfen?

Teşekkürler

5 Cevap

Senin gibi bir şey kullanabilirsiniz düşünüyorum:

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

Ben kullanmak istiyorum

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

Bu sonraki alacak

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

Ve> için count($all) 0 dönerseniz, o zaman bir sonraki / önceki video yok.

Bu deneyin. Tamamen denenmemiş, ama bu iki ek sütunlar 'sonrakiNumara' ve 'prevID' ile Sana normal satır verecektir. Bunlardan biri boşsa, o zaman bir tane değil.

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

Eğer onunla herhangi bir sorun / hata varsa, bana bildirin ve ben düzgün test edeceğiz.

iyi sorgu dizesi:

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